Kom ihåg mig?
Home Menu

Menu


Vad är fel i min SQL?

 
Ämnesverktyg Visningsalternativ
Oläst 2013-01-30, 13:56 #1
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
Standard 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
Jag har ett enkelt forum där det finns en rad med trådar.
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
Att man först tar inläggets datum och sen trådens datum. Eller tänker jag fel?

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?
secag är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-30, 15:23 #2
erikoskar erikoskar är inte uppkopplad
Nykomling
 
Reg.datum: Jan 2013
Inlägg: 2
erikoskar erikoskar är inte uppkopplad
Nykomling
 
Reg.datum: Jan 2013
Inlägg: 2
Sorteringen borde väl se ut ungefär såhär:
Kod:
ORDER BY posts.date DESC, threads.date DESC
I annat fall blir posts.date ASC(default).
erikoskar är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-30, 15:48 #3
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
Jag får liksom http://i.imgur.com/DYHwBNj.png

Trådarna upprepas :/
secag är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-30, 16:03 #4
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
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
secag är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-30, 16:23 #5
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
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.
secag är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-30, 17:10 #6
Westmans avatar
Westman Westman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jun 2004
Inlägg: 4 021
Westman Westman är inte uppkopplad
Klarade millennium-buggen
Westmans avatar
 
Reg.datum: Jun 2004
Inlägg: 4 021
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?
Westman är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-30, 17:11 #7
Westmans avatar
Westman Westman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jun 2004
Inlägg: 4 021
Westman Westman är inte uppkopplad
Klarade millennium-buggen
Westmans avatar
 
Reg.datum: Jun 2004
Inlägg: 4 021
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?
Westman är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-30, 17:29 #8
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
secag secag är inte uppkopplad
Medlem
 
Reg.datum: Nov 2012
Inlägg: 211
Aa men jag vill ännu klara mig undan för att blanda ihop poster och trådar i en tabell.
secag är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-31, 08:24 #9
Westmans avatar
Westman Westman är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jun 2004
Inlägg: 4 021
Westman Westman är inte uppkopplad
Klarade millennium-buggen
Westmans avatar
 
Reg.datum: Jun 2004
Inlägg: 4 021
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.
Westman är inte uppkopplad   Svara med citatSvara med citat
Oläst 2013-01-31, 10:51 #10
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
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
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 03:29.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017