Klarade millennium-buggen
Reg.datum: Aug 2005
Inlägg: 5 166
|
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
|