[MySQL] Probleem met ORDER BY en meerdere tabellen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Andries Louw Wolthuizen

Andries Louw Wolthuizen

29/03/2007 20:41:00
Quote Anchor link
Na eerdere pogingen, is het grotendeels toch gelukt om een werkend forum op te zetten. Echter zit ik nu met het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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
 
PHP hulp

PHP hulp

21/12/2024 13:41:32
 
Frank -

Frank -

29/03/2007 20:49:00
Quote Anchor link
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.
 
Andries Louw Wolthuizen

Andries Louw Wolthuizen

29/03/2007 20:53:00
Quote Anchor link
@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'?
Gewijzigd op 01/01/1970 01:00:00 door Andries Louw Wolthuizen
 
Frank -

Frank -

29/03/2007 21:03:00
Quote Anchor link
Jouw query op de pijnbank:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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.
 
Andries Louw Wolthuizen

Andries Louw Wolthuizen

29/03/2007 21:07:00
Quote Anchor link
@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!
 
Klaasjan Boven

Klaasjan Boven

29/03/2007 21:13:00
Quote Anchor link
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
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
 
Andries Louw Wolthuizen

Andries Louw Wolthuizen

29/03/2007 21:26:00
Quote Anchor link
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..
 
Andries Louw Wolthuizen

Andries Louw Wolthuizen

29/03/2007 21:31:00
Quote Anchor link
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..

Edit:

Ok, ik ben nu iets verder

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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
 
Andries Louw Wolthuizen

Andries Louw Wolthuizen

30/03/2007 20:50:00
Quote Anchor link
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)
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.