Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004

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?!

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)

Trädvy Permalänk
Medlem
Registrerad
Nov 2016

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.

Trädvy Permalänk
Medlem
Plats
Härnösand
Registrerad
Jan 2016

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?

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004
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

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jul 2016

@Pelle:

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

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

Trädvy Permalänk
Medlem
Plats
Härnösand
Registrerad
Jan 2016
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

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004
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

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004
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

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)

Trädvy Permalänk
Medlem
Plats
Härnösand
Registrerad
Jan 2016
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

Trädvy Permalänk
Medlem
Registrerad
Jul 2008

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.

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004

@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...

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)

Trädvy Permalänk
Medlem
Plats
Piteå
Registrerad
Okt 2004
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

CPU: AMD Ryzen 1700x @ 3.8GHz || Mem: 16GB Corsair LPX 3000mhz || Mobo: Asus x370 Prime || GPU: EVGA Geforce GTX1070 SC || SSD: WD black 500GB m2 || OS: Linux Mint/Win 10 || Monitor: Dell 43" 4K P4317Q

Citera om du vill ha svar :)