FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Medlem
|
Jag har problem med en MySQL-fråga. Jag vill hämta data ur två tabeller enligt vissa villkor.
Mina tabeller ser ut så här: Tabell1 Kod:
| kundid | artnr | antal | +--------+-------+-------+ | 229 | 61024 | 3 | | 230 | 60248 | 2 | | 230 | 62433 | 1 | | 230 | 2247 | 4 | | 231 | 64950 | 5 | +--------+-------+-------+ Kod:
| artnr | namn | +-------+--------+ | 2247 | August | | 60248 | Bertil | | 61024 | Casper | | 62433 | Daniel | | 64950 | Erik | +-------+--------+ Kod:
| artnr | antal | namn | +-------+-------+--------+ | 2247 | 4 | August | | 60248 | 2 | Bertil | | 62433 | 1 | Daniel | +-------+-------+--------+ Jag har försökt med följande SQL-fråga, men det fungerar inte. Kod:
SELECT Tabell1.artnr, Tabell1.antal, Tabell2.namn WHERE Tabell1.kundid = 230 ORDER BY Tabell1.artnr INNER JOIN Tabell2 ON Tabell1.artnr = Tabell2.artnr |
||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Medlem
|
Jag löste det själv...
![]() ...hade glömt FROM Följande fungerar: Kod:
SELECT Tabell1.artnr, Tabell1.antal, Tabell2.namn FROM Tabell1 INNER JOIN Tabell2 ON Tabell2.artnr = Tabell1.artnr WHERE Tabell1.kundid = 230 ORDER BY Tabell1.artnr |
||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Mycket flitig postare
|
Citat:
Personligen finner jag hela allt joinande i FROM delen svåröverskådligt. Och det är ytterst få fall då den typen av join är ett krav. Samma resultat får du med: Kod:
SELECT Tabell1.artnr, Tabell1.antal, Tabell2.namn FROM Tabell1, Tabell2 WHERE Tabell2.artnr = Tabell1.artnr AND Tabell1.kundid = 230 ORDER BY Tabell1.artnr VAD vill jag ha, VAR hämtar jag det och VILKA villkor gäller. Istället för att nästla in sig i en massa JOINS och villkor huller om buller. |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Medlem
|
Håller helt med om att ditt förslag är tydligare. Jag har inte jobbat med MySQL särskilt länge, så jag tänkte att det skulle vara något med JOIN eftersom jag ville hämta data ur flera tabeller och så försökte jag få ihop en fråga som fungerade.
Men, är det någon skillnad på de två sätten sett ur "SQL-serverns synvinkel"? Bortsett att de är olika tydliga för det mänskliga ögat/hjärnan - är det ena att föredra rent "tekniskt"? Är det stor skillnad på hur lång tid de tar att utföra om antalet rader som returneras är säg 200? |
||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Har WN som tidsfördriv
|
Jag har aldrig använt JOIN öht. Läste en kort broschyr från IDG "Lär dig SQL" eller något liknande när jag började med programmering, och de tipsade om att JOIN-satser är slöa, och man bör undvika dem. Stämmer detta eller finns det fördelar med JOIN-satser, eller situationer där de verkligen behövs?
|
|||
![]() |
![]() |
![]() |
#6 | |||
|
||||
Klarade millennium-buggen
|
Citat:
Givetvis är detta inte fallet då du förändrar en syntax till den grad att den betyder något annat. =) |
|||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Mycket flitig postare
|
Citat:
Och precis, de flesta DBs optimerar ju frågan själv och mig veterligen så en "join" i WHERE delen resulterar ju i en join på samma sätt som en join i from-delen. Så det handlar bara om tydlighet. |
||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Medlem
|
Vet inte om jag förstått det hela rätt, men jag tror det ligger till så här:
Följande sats: Kod:
SQL: SELECT * FROM tabell1, tabell2 WHERE tabell1.ettfalt = tabell2.annatfalt Det vill säga antaletrader blir antalrader(tabell1) * antalrader(tabell2) Sedan körs WHERE satsen på detta! Detta gör att stora tabeller snabbt blir långsamma. Tusen rader i vardera tabell ger en miljon rader att jämföra. (Med tre tusenraders tabeller blir det en miljard rader...osv) Använder man istället OUTER JOIN läggs bara den andra tabellens falt till på de funna raderna: Exempel: Kod:
SQL: SELECT * FROM tabell1 LEFT OUTER JOIN tabell2 ON (tabell1.ettfalt = tabell2.annatfalt) WHERE tabel1.falt = ??? Jag hade skrivet följande: Kod:
SQL: SELECT Tabell1.artnr, Tabell1.antal, Tabell2.namn FROM Tabell1 LEFT OUTER JOIN Tabell2 ON Tabell2.artnr = Tabell1.artnr WHERE Tabell1.kundid = 230 ORDER BY Tabell1.artnr Med hjälp av OUTER JOIN kan man även göra trevliga räkningar av antal poster med COUNT() och GROUP BY funktionen (Och även få med de som har 0 antal!) |
||
![]() |
![]() |
![]() |
#9 | ||
|
|||
Mycket flitig postare
|
Nej, du har fått två saker helt om bakfoten.
1) Att "joina" enbart i where-delen är precis samma sak som att "joina" i from delen. Databasmnmotorn kommer optimera frågan och kommer inte att skapa ett temporärt resultat med "antalrader1*antalrader2". 2) Hela grejen med outer join har du också fått om bakfoten. Du kan göra count och group by hur mycket du vill i en vanlig join. Det du gör med en outer join är att du får med resultat i tabell 1 som saknar motsvarighet i tabell 2: Exempel: tabell1: ID NAMN FK 1 nisse 1 2 kalle 2 Tabell2: ID NAMN 2 hansson Vanlig join: SELECT t1.namn, t2.namn FROM t1, t2 WHERE t1.fk = t2.id Ger: kalle hansson Outerjoin: SELECT t1.namn, t2.namn FROM t1, t2 WHERE t1.fk *= t2.id Ger: nisse NULL kalle hansson |
||
![]() |
![]() |
Svara |
|
|