FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Medlem
|
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? ![]() |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Nykomling
|
Sorteringen borde väl se ut ungefär såhär:
Kod:
ORDER BY posts.date DESC, threads.date DESC |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Medlem
|
|||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Medlem
|
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? Senast redigerad av secag den 2013-01-30 klockan 16:17 |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Medlem
|
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. |
||
![]() |
![]() |
![]() |
#6 | |||
|
||||
Klarade millennium-buggen
|
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?
|
|||
![]() |
![]() |
![]() |
#7 | |||
|
||||
Klarade millennium-buggen
|
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?
|
|||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Medlem
|
Aa men jag vill ännu klara mig undan för att blanda ihop poster och trådar i en tabell.
|
||
![]() |
![]() |
![]() |
#9 | |||
|
||||
Klarade millennium-buggen
|
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.
|
|||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Klarade millennium-buggen
|
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 ; CREATE TABLE `user` ( `userid` varchar(45) NOT NULL, `username` varchar(45) NOT NULL, PRIMARY KEY (`userid`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `threads` ( `threadid` int(11) NOT NULL AUTO_INCREMENT, `threadname` varchar(45) NOT NULL, `createddate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `closed` bit(1) NOT NULL DEFAULT b'0', `creatorid` varchar(45) NOT NULL, PRIMARY KEY (`threadid`), KEY `fk_creatorid_idx` (`creatorid`), CONSTRAINT `fk_creatorid` FOREIGN KEY (`creatorid`) REFERENCES `user` (`userid`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1; CREATE TABLE `posts` ( `postid` int(11) NOT NULL AUTO_INCREMENT, `threadid` int(11) NOT NULL, `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `deleted` bit(1) NOT NULL DEFAULT b'0', `creatorid` varchar(45) NOT NULL, `comment` varchar(255) DEFAULT NULL, `posttext` varchar(10000) NOT NULL, PRIMARY KEY (`postid`), KEY `fk_creatorid_idx` (`creatorid`), KEY `fk_posts_threadid_idx` (`threadid`), CONSTRAINT `fk_posts_creatorid` FOREIGN KEY (`creatorid`) REFERENCES `user` (`userid`) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_posts_threadid` FOREIGN KEY (`threadid`) REFERENCES `threads` (`threadid`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=latin1; sen slänger vi in lite smart testdata: Kod:
INSERT INTO `wn`.`user` (`userid`, `username`) VALUES ('anna', 'Anna Anderberg'); INSERT INTO `wn`.`user` (`userid`, `username`) VALUES ('bertil', 'Bertil Bertilsson'); INSERT INTO `wn`.`user` (`userid`, `username`) VALUES ('cecilia', 'Cecilia Cederberg'); INSERT INTO `wn`.`user` (`userid`, `username`) VALUES ('david', 'David Davidsson'); INSERT INTO `wn`.`threads` (`threadid`, `threadname`, `createddate`, `closed`, `creatorid`) VALUES ('1', 'Nu är det vår igen', '2013-01-01 00:00:00', 0, 'anna'); INSERT INTO `wn`.`threads` (`threadid`, `threadname`, `createddate`, `closed`, `creatorid`) VALUES ('2', 'Titta vad jag hittade för kul på internet', '2013-01-02 00:00:00', 0, 'bertil'); INSERT INTO `wn`.`threads` (`threadid`, `threadname`, `createddate`, `closed`, `creatorid`) VALUES ('3', 'Kan man bli bättre än så här?', '2013-01-03 00:00:00', 0, 'bertil'); INSERT INTO `wn`.`threads` (`threadid`, `threadname`, `createddate`, `closed`, `creatorid`) VALUES ('4', 'Är hästar däggdjur?', '2013-01-04 00:00:00', 0, 'anna'); INSERT INTO `wn`.`threads` (`threadid`, `threadname`, `createddate`, `closed`, `creatorid`) VALUES ('5', 'Fullt med nya idéer', '2013-01-05 00:00:00', 0, 'bertil'); INSERT INTO `wn`.`threads` (`threadid`, `threadname`, `createddate`, `closed`, `creatorid`) VALUES ('6', 'Vårt gemensamma mål!', '2013-01-06 00:00:00', 0, 'anna'); INSERT INTO `wn`.`posts` (`threadid`, `created`, `creatorid`, `posttext`) VALUES ('1', '2013-01-04 00:00:00', 'anna', 'Berättar denna text något vettigt?'); INSERT INTO `wn`.`posts` (`threadid`, `created`, `creatorid`, `posttext`) VALUES ('1', '2013-01-05 00:00:00', 'bertil', 'Inte den här heller!'); INSERT INTO `wn`.`posts` (`threadid`, `created`, `creatorid`, `posttext`) VALUES ('3', '2013-01-03 00:00:00', 'david', 'Men nu får du väl ge dig?'); INSERT INTO `wn`.`posts` (`threadid`, `created`, `creatorid`, `posttext`) VALUES ('3', '2013-01-04 00:00:00', 'cecilia', 'Kanske för den här gången då?'); 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 FROM ( SELECT threadid, MAX(createddate) AS senastedatum from wn.threads GROUP BY threadid UNION SELECT threadid, MAX(created) AS senastedatum from wn.posts GROUP BY threadid ) x GROUP BY threadid ORDER BY senastedatum DESC; Senast redigerad av Conny Westh den 2013-01-31 klockan 10:58 |
||
![]() |
![]() |
Svara |
|
|