[MySQL] Probleem met ORDER BY en meerdere tabellen
eerdere pogingen, is het grotendeels toch gelukt om een werkend forum op te zetten. Echter zit ik nu met het volgende:
Wat ik wil is:
- Alle topics
-- Uit tabel topic: id, titel, bekeken
--Uit tabel reactie: laatste reactie, id (later naam) van de poster met de eerste reactie (de ts)
-- Uit tabel phpmylogon de naam (aan de hand van id) v/d ts (topic starter)
---Waarbij het id van de poster van de eerste reactie de ts voorstelt.
--Totaal aantal reacties
Tabel structuur:
topic
-id
-titel
-bekeken
reactie
-id
-topic_id
-phpmylogon_id
-tekst
-datum
phpmylogon
-id
-name
Wat er mis gaat bij de query is dat ik bij order by .. DESC niet de naam van de topicstarter bij het topic krijg, maar de naam van degene met de laatste reactie. Doe ik echter ASC dan krijg ik niet de datum/tijd van degene met de laatste reactie.
Is hier een oplossing voor? Dus het phpmylogon_id van degene met de eerste reactie op het topic, en de datum/tijd van de laatste reactie op het topic.
Ikzelf kom er niet uit, en hoop dat iemand van jullie de oplossing weet.
Na Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT topic.*, phpmylogon.name AS name, reactie.phpmylogon_id, COUNT(reactie.id) AS reacties, MAX(UNIX_TIMESTAMP(reactie.datum)) AS laatste_reactie
FROM topic, reactie, phpmylogon
WHERE topic.id = reactie.topic_id
AND phpmylogon.id = reactie.phpmylogon_id
GROUP BY topic.id
ORDER BY laatste_reactie DESC
FROM topic, reactie, phpmylogon
WHERE topic.id = reactie.topic_id
AND phpmylogon.id = reactie.phpmylogon_id
GROUP BY topic.id
ORDER BY laatste_reactie DESC
Wat ik wil is:
- Alle topics
-- Uit tabel topic: id, titel, bekeken
--Uit tabel reactie: laatste reactie, id (later naam) van de poster met de eerste reactie (de ts)
-- Uit tabel phpmylogon de naam (aan de hand van id) v/d ts (topic starter)
---Waarbij het id van de poster van de eerste reactie de ts voorstelt.
--Totaal aantal reacties
Tabel structuur:
topic
-id
-titel
-bekeken
reactie
-id
-topic_id
-phpmylogon_id
-tekst
-datum
phpmylogon
-id
-name
Wat er mis gaat bij de query is dat ik bij order by .. DESC niet de naam van de topicstarter bij het topic krijg, maar de naam van degene met de laatste reactie. Doe ik echter ASC dan krijg ik niet de datum/tijd van degene met de laatste reactie.
Is hier een oplossing voor? Dus het phpmylogon_id van degene met de eerste reactie op het topic, en de datum/tijd van de laatste reactie op het topic.
Ikzelf kom er niet uit, en hoop dat iemand van jullie de oplossing weet.
Gewijzigd op 01/01/1970 01:00:00 door Andries Louw Wolthuizen
Jouw query is onmogelijk, daar heb je 2 queries of 1 query met sub-query voor nodig.
'Ja maar MySQL geeft geen error'... Tja, dat is nu net het probleem met MySQL, iedere andere database geeft gewoon een error op bovenstaande query.
Voor alle duidelijkheid, ik wil de naam (of phpmylogon_id) van degene met de eerste reactie.
En de datum van de laatste reactie.
En doet phphulp.nl het ook met 2 queries?
En zijn die 2 queries 'per rij'? Of 'eenmalig'?
Gewijzigd op 01/01/1970 01:00:00 door Andries Louw Wolthuizen
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
topic.*, <== kan niet, zie GROUP BY
phpmylogon.name AS name,
reactie.phpmylogon_id,
COUNT(reactie.id) AS reacties, <== kan niet, COUNT eist een GROUP BY
MAX(UNIX_TIMESTAMP(reactie.datum)) AS laatste_reactie <== kan niet
FROM
topic,
reactie,
phpmylogon
WHERE
topic.id = reactie.topic_id
AND
phpmylogon.id = reactie.phpmylogon_id
GROUP BY
topic.id <== maak groepen aan op basis van het topic id
ORDER BY laatste_reactie DESC
topic.*, <== kan niet, zie GROUP BY
phpmylogon.name AS name,
reactie.phpmylogon_id,
COUNT(reactie.id) AS reacties, <== kan niet, COUNT eist een GROUP BY
MAX(UNIX_TIMESTAMP(reactie.datum)) AS laatste_reactie <== kan niet
FROM
topic,
reactie,
phpmylogon
WHERE
topic.id = reactie.topic_id
AND
phpmylogon.id = reactie.phpmylogon_id
GROUP BY
topic.id <== maak groepen aan op basis van het topic id
ORDER BY laatste_reactie DESC
Zodra je GROUP BY gebruikt, maak je een groep aan. Alle gegevens die jij vervolgens ophaalt, moeten eigenschappen van deze groep zijn. De groep, bv. id nummer 23, kent echter verschillende datums, verschillende mensen die hebben gereageerd, etc. etc. Jij probeert met * echter alles op te halen. Dat kan niet!
Oplossing: gooi deze query weg en begin opnieuw. Maak eerst verschillende, correcte, queries en ga deze later evt. nog samenvoegen. Maar alleen wanneer dat mogelijk is!
Tip: Gebruik PostgreSQL, dan was je dit niet gebeurd. Of eigenlijk, was de query gewoon keihard afgekeurd.
Ik zou graag, zeer graag, PostgreSQL willen gebruiken, maar zoals je weet zijn er nog altijd mensen, die een host hebben, waarbij een MySQL database al uitzonderlijk is ;)
Ik ga de query eens helemaal opnieuw maken, kijken of ik eruit kom.
Bedankt voor de hulp tot nu toe!
Bron
Bron
Bron
En let op mysql heeft gemeend het net iets anders te doen dan de andere RDMS
Quote:
MySQL extends the use of GROUP BY so that you can use non-aggregated columns or calculations in the SELECT list that do not appear in the GROUP BY clause.
Dat maakt het imo alleen maar verwarrend
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
Van een topic informatie als id, titel en bekeken tonen lukt wel.
Een phpmylogon_id omzetten naar een name lukt ook.
Maar dan mis ik de volgende functies nog:
Het tonen van de naam van degene met de eerste reactie.
Het tonen van het aantal reacties.
Het tonen van de datum/tijd van de laatste reactie.
Het sorteren van de topics op laatste reactie.
Ik heb ook geen idee waar ik beginnen of eindigen moet..
En die group by blijft voor mij ook vaag ;), ik ga nog eens zoeken naar duidelijkere tutorials..
Helaas krijg ik hiermee wel dubbele gegevens, iets waar ik echt niet van hou..
Edit:
Ok, ik ben nu iets verder
Ok, ik ben nu iets verder
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT topic.id, topic.titel, topic.bekeken, phpmylogon.name, COUNT(reactie.id) AS reacties, MAX(reactie.datum) AS laatste_reactie
FROM topic
LEFT OUTER JOIN reactie ON topic.id = reactie.topic_id
LEFT OUTER JOIN phpmylogon ON topic.phpmylogon_id = phpmylogon.id
GROUP BY topic.id
ORDER BY laatste_reactie
FROM topic
LEFT OUTER JOIN reactie ON topic.id = reactie.topic_id
LEFT OUTER JOIN phpmylogon ON topic.phpmylogon_id = phpmylogon.id
GROUP BY topic.id
ORDER BY laatste_reactie
Nu heb ik aan de tabel topic het veld phpmylogon_id toegevoegd, wat dus slaat op het id van de topicstarter. Helaas heb ik nu wel dubbele gegevens (immers is het id van degene met de eerste reactie gelijk aan de topicstarter). Ook heb ik het idee dat ik weer verkeerd gebruik maak van GROUP BY.
Het werkt dus, maar ik ben niet tevreden..
Gewijzigd op 01/01/1970 01:00:00 door Andries Louw Wolthuizen
(Geeft topic een zetje)