![]() |
Vad är fel i min SQL?
Kod:
SELECT threads.*, user.id AS user_id, user.username FROM threads JOIN user ON user.id = threads.uid JOIN posts ON posts.tid = threads.id ORDER BY posts.date, threads.date DESC I trådarna finns poster där varje inlägg har trådens ID(tid). Jag vill sortera trådarna på datum igenom det senaste skriva inlägget. Om inte tråden har någon post så ska den sortera på när tråden skrevs. Såhär har jag tänkt mig: Kod:
ORDER BY posts.date, threads.date DESC Jag har 2 tabeller. threads och posts. Tabbellen user hämtar endast användar ID och användarnamn men det funkar bra. Dock funkar inte sorteringen. Vet ni något? :) |
Sorteringen borde väl se ut ungefär såhär:
Kod:
ORDER BY posts.date DESC, threads.date DESC |
|
EDIT: Ja testade nu att göra en tråd utan något inlägg. Då ser jag inte tråden på trådvyn. Hur fixar jag detta?
Löste det nu: SELECT threads.*, user.id AS user_id, user.username FROM threads JOIN user ON user.id = threads.uid JOIN posts ON posts.tid = threads.id GROUP BY threads.id ORDER BY MAX(posts.date) DESC, threads.date DESC Hittade på ett annat forum. Men kan någon förklara vad GROUP BY används för och vad den gör i detta fall? |
Provade detta nu:
Provade med denna SELECT threads.*, user.id AS user_id, user.username FROM threads JOIN user ON user.id = threads.uid LEFT JOIN posts ON threads.id = posts.tid GROUP BY threads.id ORDER BY MAX(posts.date) DESC, threads.date DESC. Då ser jag detta: http://i.imgur.com/aIGcge6.png Alltså, alla trådar syns nu men tråden som inte har något inlägg läggs längst ner även fast den gjordes efter allting annat. |
Inte så konstigt, du har ju MAX(posts.date) DESC före threads.date DESC. Alltså sorterar den på posters datum före trådars datum och du har ju inga poster i den som är längst ned. Eller?
|
Jag misstänker att du vill sortera på en sammanslagen lista av datum från både poster och trådar, har jag rätt?
|
Aa men jag vill ännu klara mig undan för att blanda ihop poster och trådar i en tabell.
|
Du behöver nog två kolumner i tabellen threads. En för datumet då tråden skapades och en för senaste ändring (t.ex. postning). Då kan du sortera på senaste ändring, oavsett om tråden har en post eller inte.
|
Jag la upp lite testdata och längst ner hittar du en möjlig lösnin på ditt problem.
Jag ändrade en del kolumnnamn så det dels blir lättare att följa koden och dels så den stämmer med god programmeringssed "id" är inget bra namn på en kolumn särskilt inte om den förekommer i flera tabeller, så jag har gett varje Primärnyckel unika namn enligt god programmeringssed. Först skapar vi databasstrukturen: Kod:
delimiter ; sen slänger vi in lite smart testdata: Kod:
INSERT INTO `wn`.`user` (`userid`, `username`) VALUES ('anna', 'Anna Anderberg'); Sists så kör vi en fråga för att få fram alla trådarna sorterade efter senaste postningsdatum om det finns ett sånt annars får det bli trådens skapandedatum: Kod:
SELECT threadid, MAX(senastedatum) as senastedatum |
Alla tider är GMT +2. Klockan är nu 03:35. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson