Permalänk
Medlem

Knepig mysql query...

Tja,

Jag försöker joina 2 tables där ena har flera poster av samma id (jag vill bara ha högsta av varje id)

Kör jag utan group by så får jag det att sorteras rätt, men jag får tusan inte till det med group by...

Jag har provat bland annat dessa:

$sql = "SELECT ThreadHead.ThreadID, ThreadHead.ThreadBy, ThreadHead.ThreadStarted, ThreadHead.ThreadSubject, ThreadHead.ForumID FROM ThreadHead JOIN (SELECT ThreadReplied,ThreadID FROM ThreadPosts) AS TH ON ThreadHead.ThreadID=TH.ThreadID WHERE ThreadHead.ForumID='$fid' GROUP BY ThreadID ORDER BY TH.ThreadReplied DESC";

$sql = "SELECT ThreadHead.ThreadID, ThreadHead.ThreadBy, ThreadHead.ThreadStarted, ThreadHead.ThreadSubject, ThreadHead.ForumID, ThreadPosts.ThreadPostID, ThreadPosts.ThreadID, ThreadPosts.ThreadReplied, ThreadPosts.ThreadReplyer FROM ThreadHead JOIN ThreadPosts on ThreadHead.ThreadID=ThreadPosts.ThreadID WHERE ThreadHead.ForumID='$fid' GROUP BY ThreadHead.ThreadID,ThreadPosts.ThreadID ORDER BY ThreadPosts.ThreadReplied desc";

$sql = "SELECT ThreadHead.ThreadID, ThreadHead.ThreadBy, ThreadHead.ThreadStarted, ThreadHead.ThreadSubject, ThreadHead.ForumID FROM ThreadHead JOIN (SELECT ThreadReplied,ThreadID FROM ThreadPosts GROUP BY ThreadID) AS TH ON ThreadHead.ThreadID=TH.ThreadID WHERE ThreadHead.ForumID='$fid' ORDER BY ThreadReplied DESC";

Så hur tusan gör jag för att få det att sortera rätt?!

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem

Det blir nog svårt att svara på utan ett exempel, om du kan lägga upp något på till exempel http://sqlfiddle.com/ så kanske någon kan svara på det.

Du har nog inte heller direkt förklarat vad som blir fel i din fråga. Bara att något sorteras fel.

Hoppas förresten du validerar vad $fid innehåller, som till exempel att det endast är en siffra, annars lämnar du öppet för sql injektion attacker.

Permalänk
Medlem

Bättre köra med INNER JOIN samt LEFT JOIN än just JOIN när du kör med flera tabeller, vad får du får felmeddelanden?

Permalänk
Medlem
Skrivet av kyuw:

Det blir nog svårt att svara på utan ett exempel, om du kan lägga upp något på till exempel http://sqlfiddle.com/ så kanske någon kan svara på det.

Du har nog inte heller direkt förklarat vad som blir fel i din fråga. Bara att något sorteras fel.

Hoppas förresten du validerar vad $fid innehåller, som till exempel att det endast är en siffra, annars lämnar du öppet för sql injektion attacker.

Jorå det är lugnt gällande injections, jo jag förstår att det är lite luddigt, kan ordna sen ikväll. Det fungerar som det ska bara att det inte sorteras efter threadreplied datumen

Skrivet av UMJ:

Bättre köra med INNER JOIN samt LEFT JOIN än just JOIN när du kör med flera tabeller, vad får du får felmeddelanden?

Okej, har dock provat utan bättre resultat, inga felmeddelanden bara de att den skiter totalt i min order by

Visa signatur

Citera om du vill ha svar :)

Permalänk
Avstängd

@Pelle:

hämtar den allt eller söker den efter viss datum?

Visa signatur

Man är inte dum för att man har stavproblem.
Läs mer om min synfel Visual Snow
Om mig ----> #16970666

Permalänk
Medlem
Skrivet av Pelle:

Jorå det är lugnt gällande injections, jo jag förstår att det är lite luddigt, kan ordna sen ikväll. Det fungerar som det ska bara att det inte sorteras efter threadreplied datumen

Okej, har dock provat utan bättre resultat, inga felmeddelanden bara de att den skiter totalt i min order by

Dock är det lite svårt veta exakt hur du har skapad dessa men har gjort ett exempel i allefall

SELECT h.ThreadID, h.ThreadBy, h.ThreadStarted, h.ThreadSubject, h.ForumID, p.ThreadPostID, p.ThreadID, p.ThreadReplied, p.ThreadReplyer FROM ThreadHead h INNER JOIN ThreadPosts p ON h.ThreadID = p.ThreadID WHERE h.ForumID='$fid' AND p.ThreadID ='$fid' /* GROUP BY h.ThreadID AND p.ThreadID */ ORDER BY p.ThreadReplied desc";

Här H är för head och P för post

Permalänk
Medlem
Skrivet av superegg:

@Pelle:

hämtar den allt eller söker den efter viss datum?

den hämtar allt för att sen gruppera efter id

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem
Skrivet av UMJ:

Dock är det lite svårt veta exakt hur du har skapad dessa men har gjort ett exempel i allefall

SELECT h.ThreadID, h.ThreadBy, h.ThreadStarted, h.ThreadSubject, h.ForumID, p.ThreadPostID, p.ThreadID, p.ThreadReplied, p.ThreadReplyer FROM ThreadHead h INNER JOIN ThreadPosts p ON h.ThreadID = p.ThreadID WHERE h.ForumID='$fid' AND p.ThreadID ='$fid' /* GROUP BY h.ThreadID AND p.ThreadID */ ORDER BY p.ThreadReplied desc";

Här H är för head och P för post

Tack jag ska kolla lite på det sen och posta mer utförligt hur tabellerna ser ut

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem
Skrivet av Pelle:

Tack jag ska kolla lite på det sen och posta mer utförligt hur tabellerna ser ut

Det skulle underlätta om du förklarar vad varje tabell gör, för du ska få träffar behöver du samma ID i båda tabellerna, så man kan kolla ihop vilka poster som tillhör vilken tråd.

Men också vad du hade tänkt göra och hur den ska sortera, och vad den ska hämta, ska den hämta alla poster eller vissa poster, och börja du ha mer än 25-50 poster så skulle jag rekommenderar att du gör ett page system så den skapar en ny sida efter x antal resultat.

Som den jag har gjort så ska den hämta allting som har samma ID i båda tabellerna om treadid är desamma det är ju osäkert för det finns ju ingen information från din sida om det men jag gissade på det.

För man vill ju inte ha massa poster som tillhör en annan tråd och du kan ju lägga till också i WHERE efter mer gallring genom AND eller OR elller BEETWEEN

Permalänk
Medlem

Om du bara vill sortera raderna i ThreadHead på senaste ThreadPosts kopplad till den tråden:

SELECT ThreadHead.* ,MAX(ThreadPosts.ThreadReplied) AS LastPost FROM ThreadHead JOIN ThreadPosts ON ThreadHead.ThreadID = ThreadPosts.ThreadID GROUP BY ThreadHead.ThreadID ORDER BY LastPost DESC;

Om du även vill ha med den senaste posten (förutsätter att ThreadID och ThreadReplied är unikt för raderna i ThreadPosts):

SELECT ThreadHead.*, ThreadPosts.* FROM ThreadHead JOIN ThreadPosts ON ThreadHead.ThreadID = ThreadPosts.ThreadID JOIN (SELECT ThreadPosts.ThreadID ,MAX(ThreadPosts.ThreadReplied) AS LastPost FROM ThreadPosts GROUP BY ThreadPosts.ThreadID) AS g ON ThreadPosts.ThreadID = g.ThreadID AND ThreadPosts.ThreadReplied = g.LastPost ORDER BY ThreadPosts.ThreadReplied DESC;

Med reservation för att det antagligen finns bättre lösningar eftersom att jag vanligtvis använder T-SQL, där jag för den andra varianten hade använt en lösning med ROW_NUMBER vilket inte verkar finnas för MySQL.

Permalänk
Medlem

@johho @umj @kyuw

Såhär ser tabellerna ut då dom har lite data i sig:

ThreadHead:

och ThreadPosts:

Då kanske ni förstår lite bättre vad jag är ute efter?

alltså joina ThreadHead.ThreadID med ThreadPosts.ThreadID och bara ta senaste inlägget från varje id i threadposts...

Visa signatur

Citera om du vill ha svar :)

Permalänk
Medlem
Skrivet av johho:

Om du bara vill sortera raderna i ThreadHead på senaste ThreadPosts kopplad till den tråden:

SELECT ThreadHead.* ,MAX(ThreadPosts.ThreadReplied) AS LastPost FROM ThreadHead JOIN ThreadPosts ON ThreadHead.ThreadID = ThreadPosts.ThreadID GROUP BY ThreadHead.ThreadID ORDER BY LastPost DESC;

Om du även vill ha med den senaste posten (förutsätter att ThreadID och ThreadReplied är unikt för raderna i ThreadPosts):

SELECT ThreadHead.*, ThreadPosts.* FROM ThreadHead JOIN ThreadPosts ON ThreadHead.ThreadID = ThreadPosts.ThreadID JOIN (SELECT ThreadPosts.ThreadID ,MAX(ThreadPosts.ThreadReplied) AS LastPost FROM ThreadPosts GROUP BY ThreadPosts.ThreadID) AS g ON ThreadPosts.ThreadID = g.ThreadID AND ThreadPosts.ThreadReplied = g.LastPost ORDER BY ThreadPosts.ThreadReplied DESC;

Med reservation för att det antagligen finns bättre lösningar eftersom att jag vanligtvis använder T-SQL, där jag för den andra varianten hade använt en lösning med ROW_NUMBER vilket inte verkar finnas för MySQL.

Danke,

$sql = "SELECT ThreadHead.* ,MAX(ThreadPosts.ThreadReplied) AS LastPost FROM ThreadHead JOIN ThreadPosts ON ThreadHead.ThreadID = ThreadPosts.ThreadID WHERE ThreadHead.ForumID='$fid' GROUP BY ThreadHead.ThreadID ORDER BY LastPost DESC";

verkar ha gjort susen

Visa signatur

Citera om du vill ha svar :)