[sql] Order by + join
ik heb nu deze query:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT s.id, s.onderwerp, s.status
FROM support s
INNER JOIN support_tickets AS t
ON t.id_support = s.id
WHERE s.id_leden = ".mysql_real_escape_string($_SESSION['user_id'])."
ORDER BY t.datum DESC
FROM support s
INNER JOIN support_tickets AS t
ON t.id_support = s.id
WHERE s.id_leden = ".mysql_real_escape_string($_SESSION['user_id'])."
ORDER BY t.datum DESC
Ik wil dus de support berichten sorteren op laatste reactie. Hiervoor kijk ik naar de datum in de tabel support_tickets.
Nu is er iets heel vreemds.
Ik heb 2 support berichten (1 en 2)
support 1 heeft 2 reacties (1 en 3)
support 2 heeft 2 reacties (2)
Nu weergeeft mijn script de code zo:
support 1 (van reactie 3) -> nieuwste reactie
support 2 -> tussen reactie
support 1 (van reactie 1) -> oudste reactie
Hoe los ik dit op?
Dat kan via DISTINCT. Met DISTINCT selecteert hij alleen unieke ID's, dus in dit geval alleen unieke support id's.
support 2 -> deze staat eerst
support 1 -> deze moet eerst staan want die heeft de laatste reactie
edit, ik denk dat ik weet hoe het komt, er word bij support namelijk gekeken naar de 1ste reactie. Maar ik moet de laatste reactie hebben, hoe doe ik dat?
Gewijzigd op 14/05/2011 17:13:38 door Jasper DS
Gewijzigd op 14/05/2011 17:52:32 door Ben Van de Voorde
Bart Wout op 14/05/2011 17:51:21:
ASC
nee, werkt niet.
3 support berichten
support 1
support 2
support 3
4 reacties
reactie 1 (1)
reactie 2 (2)
reactie 3 (1)
reactie 4 (3)
dan zou het zo moeten weergeven worden van nieuw naar oud
support 3 want reactie 4 is het nieuwste
support 1 want dan komt reactie 3
support 2 en dan komt reactie 2
Volgens mij gebruiken ze hier op het forum ook zo'n query, namelijk om de topics met de laatste reactie eerst te weergeven.
Gewijzigd op 14/05/2011 18:14:37 door Jasper DS
Zou je de where niet eerder uit reactie bericht halen?
Nu haalt die de waarde op als er een suport bericht met het zelfde bericht van gebruiker. maar wat nu als ik alleen maar een reactie plaats. Dan kan die hem dus nooit op halen. Lijkt mij dus de fout in de where te zitten
Hoe verander ik die where dan? Ik moet nog op de één of andere manier kunnen kijken welk support bericht bij welke persoon hoort?
dan kun je de where uit je leden tabel halen.
http://www.phphulp.nl/php/tutorial/overig/sql-joins-uitgebreid/479/meer-dan-2-tabellen/1118/
zo heb ik het mijn laatste keer opglost
Gewijzigd op 14/05/2011 20:28:19 door simon ploegh
neen? waarom zou ik dat doen?
Zo ja, voeg dan de JOIN toe aan je query om de gegevens van de support vraag op te halen...
Hieronder ziet u een printscreen met naast de support berichten de datums:
Hieronder ziet u de fout:
de support berichten met id 1 en 2 zouden van plaats moeten wisselen als je kijkt naar hun datum in het 1ste plaatje
Gewijzigd op 16/05/2011 17:40:10 door Jasper DS
Wil je dat in SQL oplossen, gebruik dan UNIQUE op bijvoorbeeld s.id om elk topic maximaal 1x op te halen. Je kunt het ook in PHP oplossen door in de loop, waarin je de resultaatset uitleest, in een array bij te houden welke id's je al gehad hebt. Staat een betreffend id al in die array, dan geef je dat record niet meer weer. Deze laatste is wel de minst efficiente manier aangezien je wel alle records ophaalt terwijl dat niet nodig is...
Gewijzigd op 16/05/2011 17:53:29 door Jasper DS
Bump..
Welke error krijg je? En hoe zie je query er nu uit?
Je wil dus feitelijk de reacties selecteren, met de support als extra informatie. Probeer eens te selecteren vanuit de reacties tabel en dan joinen naar de support :)
De foutmelding ziet er zo uit:
Code (php)
1
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNIQUE(s.id), s.onderwerp, s.status FROM support_tickets AS t INNER JOIN support' at line 1
De code zo:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT UNIQUE(s.id), s.onderwerp, s.status
FROM support s
INNER JOIN support_tickets AS t
ON t.id_support = s.id
WHERE s.id_leden = ".mysql_real_escape_string($_SESSION['user_id'])."
ORDER BY t.datum desc
FROM support s
INNER JOIN support_tickets AS t
ON t.id_support = s.id
WHERE s.id_leden = ".mysql_real_escape_string($_SESSION['user_id'])."
ORDER BY t.datum desc
@Erik,
ik heb jouw manier even getest en bekom hetzelfde resultaat als met de andere query:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT UNIQUE(s.id), s.onderwerp, s.status
FROM support_tickets AS t
INNER JOIN support AS s
ON s.id = t.id_support
WHERE s.id_leden = 1
ORDER BY t.datum desc
FROM support_tickets AS t
INNER JOIN support AS s
ON s.id = t.id_support
WHERE s.id_leden = 1
ORDER BY t.datum desc
Gewijzigd op 18/05/2011 13:37:41 door Jasper DS
Oeps, my bet. UNIQUE moet natuurlijk DISTINCT zijn :-)
Krijg ik nog steeds hetzelfde resultaat als op mijn 2de afbeelding. Dan toch voor de php oplossing gaan?
Toch nog maar een bump..