[MySQL] Probleem met ORDER BY en meerdere tabellen
Na 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.
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
GROUP BY... En dan kun je dus alleen gegevens opvragen die op de héle groep slaan. De naam van de topicstarter hoort daar niet bij, net zo min als de naam van degene met de laatste reactie.
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.
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.
@Frank:
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'?
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
Jouw query op de pijnbank:
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.
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.
@Frank:
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!
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!
Frank heeft gelijk bovendien gebruik je GROUP BY ook nog FOUT.
GROUP BY zonder HAVING is zinloos volgens mij. Wat jij bedoelt is waarschijnlijk DISTINCT
Bron
Bron
Bron
En let op mysql heeft gemeend het net iets anders te doen dan de andere RDMS
Dat maakt het imo alleen maar verwarrend
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
Ik kom er echt niet meer uit.
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..
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..
Ik wilde het zo veel mogelijk voorkomen, maar volgens mij moet ik in de tabel topic toch echt de id gaan aangeven van de topic_starter..
Helaas krijg ik hiermee wel dubbele gegevens, iets waar ik echt niet van hou..
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..
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
Mocht iemand nog een nuttige toevoeging hebben, of een oplossing waardoor mijn dubbele gegevens voorkomen worden, dan hoor ik dat alsnog graag!
(Geeft topic een zetje)
(Geeft topic een zetje)




