![]() |
Slutföra SQL query
Hej, ska hämta alla inlägg där kolumnen thread inte är noll och i en annan tabell där kolumnen forum = $_GET["f"]
Den första tabellens kolumns 'thread' har en koppling till ID-numret till den andra tabbellen. Jag har kommit såhär långt: SELECT * FROM forum_posts WHERE thread != '0' ORDER BY date DESC Men jag skulle vilja ha det något såhär: SELECT * FROM forum_posts WHERE thread != '0' AND IN TABLE 'table2' IS 'forum_column' = $_GET["f"] ORDER BY date DESC Queryn över är ett exempel på hur jag vill att det ska fungera, men jag vet inte hur jag skriver det på riktigt. |
Det jag misstänker att du söker är JOIN
SELECT col1, col2 FROM table1 JOIN table2 ON table1.id = table2.id WHERE table1.col1 = '0' http://www.w3schools.com/sql/sql_join.asp |
Jo, ja glömde att tillägga att min query ska sluta såhär:
ORDER BY MAX(forum_posts.date) DESC Men om jag ska använda JOIN så får jag inte med mig 'date' för alla andra rader där thread har värdet 1 eller mer. Det jag vill ha ut av hela queryn är alla trådar i ett forum sorterat på vilket datum tråden gjorde eller när senaste inlägget i en tråd gjordes. Då jag säger 'eller' menar jag att om en tråd inte har några inlägg så skall man sortera på publiceringsdatumet. |
Det verkar som du har syntaxen helt fel, beskriv vad du vill göra i stället så man fårstår vad du egentligen vill.
Du använder MAX() på helt fel sätt så det är svårt att förstå vad du egentligen är ute efter! sen undrar jag varför thread är en textcolumn? den borde väl vara numerisk? |
http://fuskbugg.se/dl/P46GNS
Sorry att det är en bild med det var det enklaste sättet att visa er tabellstrukturen |
Varför har du en kolumn som heter thread_id och en som heter thread i samma tabell?
Varför duger inte följande kod? SELECT (Select Max(date) from forum_posts p where p.thread_id=h.id) AS LatestPost, * FROM forum_heads h ORDER BY 1 Det går även att åstadkomma samma sak med "JOIN" och "Group By" som är något mer effektivt i teorin i alla fall. |
Om jag tolkar TS rätt så vill han visa trådarna i en lista men så att de är sorterade så att den tråd som har senaste inlägget kommer först i listan.
Då måste man utgå från tabellen forum_threads och joina in ett sorteringsvärde med max(Date) från forums_posts-tabellen så att man får det senaste datumet från forum_posts. Om det är så så var det bara en dålig kravspecifikation i första inlägget. Annars har jag totalt missuppfattat vad TS vill åstadkomma. Glömde DESC i mitt förra inlägg: SELECT (Select Max(date) from forum_posts p where p.thread_id=h.id) AS LatestPost, * FROM forum_heads h ORDER BY 1 DESC |
thread_id betyder att det inlägget är kopplat till den tråd. thread betyder att det inlägget är själva trådinlägget.
Citat:
|
Conny, vill du förklara vad den där queryn gör? Är inte så van vid att använda subquerys.
Och ORDER BY 1, vad händer om det är en etta? |
ORDER BY 1 berättar att det ska sorteras enligt första kolumnen i svaret.
Gör dig själv en tjänst och glöm bort detta direkt igen och skriv alltid ut kolumnnamn istället =) |
Citat:
|
Citat:
Nämligen att lista alla trådar men i en ordning där den tråd med senaste inlägget kommer först i listan. (Jag glömde dock DESC i ORDER BY). Det är inget fel att använda subquerys, men ibland finns det effektivare sätt att lösa saker på, men de kan vara svårare att förklara. Man ska INTE börja med att optimera en SQL-fråga eller progrankod över huvud taget utan först se till att den gör det den ska göra, Först sen börjar man fundera på att optimera och hitta snabbare eller mer minnes-snåla vägar att lösa samma problem. Såna saker lär man sig med tiden ju mer erfaren man blir inom systemutveckling. Jag märker direkt vilka det är som gått utbildning på KTH och vilka som gått en riktig systemvetarutbildning, för KTHare har en tendens att alltid börja optimera innan de ens vet om de löst problemet eller inte. Därmed inte sagt att alla somgått KTH-utbildning är suboptimerande, men man ser mycket av den varan därifrån. Fungerade SQL-frågan som du tänkt eller blev det fel resultat? Subqueryn isig tar fram senaste datum för alla inlägg i just den enskilda tråden med samma thread_id och i detta fall fanns det två thread_id, 1 och 2 enligt form_thread-tabellen. men eftersom alla inläggen ligger i form_posts så är det i den tabellen vi letar upp alla datumen. Denna subquesry kommer att exekveras för varje rad i form_thereads-tabellen, vilket i just detta fall innebär två exekveringar. Jag förstår att du är ovan med SQL och därför väljer jag att visa mer pedagogiska lösningar som är lättare att förstå än att ge mig på onödig aoptimeringar innan vi vet om det löser det problem du vill lösa. |
Citat:
|
Om du kör subqueryn för sig och byter h.id mot 1 respektive 2 vid olika körningar så kan du se att den tar fram det största/senaste datumet för alla inläggen i just den tråden:
SELECT Max(Date) FROM forum_posts WHERE thread_id = 1 respektive : SELECT Max(Date) FROM forum_posts WHERE thread_id = 2 när jag i Subqueryn skriver ... FROM forum_heads h ... så sätter jag upp ett alias som heter "h" som gör att de blir kortare att skriva. och då kan jag skriva "h.id" i stället för "forum_heads.id". h.id kopplar dynamiskt ihop den inre subqueryn med varje rad i den yttre SQL-queryn där vi satt ett alias på forum_heads till p (jag kallade den tabellen felaktigt för forum_threads i några tidigare inlägg). Du kan inte nå den inre subqueryn på samma sätt från den yttre utan det funkar bara inifrån och ut så att säga. Detta gör att man kan skriva mycket koplexa subqueryn som var och en är isolerad från den yttre SQL-frågan, vilket blir mycket smidigt om man vill göra riktigt komplexa subqueryn. |
Har inte läst några av de ovanstående kommentarerna speciellt noga, men slänger ut detta ändå..
Detta bör fungera: PHP-kod:
|
Alla tider är GMT +2. Klockan är nu 15:04. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson