Kom ihåg mig?
Home Menu

Menu


Hur formulera INNER JOIN-fråga?

Ämnesverktyg Visningsalternativ
Oläst 2005-01-13, 19:10 #1
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
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   |
+--------+-------+-------+
Tabell2
Kod:
| artnr | namn  |
+-------+--------+
| 2247 | August |
| 60248 | Bertil |
| 61024 | Casper |
| 62433 | Daniel |
| 64950 | Erik  |
+-------+--------+
Resultatet vill jag få till följande utseende
Kod:
| artnr | antal | namn  |
+-------+-------+--------+
| 2247 | 4   | August |
| 60248 | 2  | Bertil |
| 62433 | 1  | Daniel |
+-------+-------+--------+
Jag vill alltså plocka ut artnr och antal ur Tabell1 för ett givet kundid (här t.ex. 230) och sortera efter artnr. Dessutom vill jag samtidigt för varje artnr hämta namn ur Tabell2.

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
Kan man inte blanda villkor i WHERE och ON så här? Eller vad har jag gjort galet?
etanders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-01-13, 19:47 #2
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
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
etanders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-01-13, 21:12 #3
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
Citat:
Originally posted by etanders@Jan 13 2005, 20:47
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
Jag förstår inte varför folk envisas med att krångla till det.
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
Är inte det tydligare? Tankesättet är ju glasklart.
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.
eg0master är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-01-13, 21:46 #4
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
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?
etanders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-01-13, 23:04 #5
koalas avatar
koala koala är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Sep 2004
Inlägg: 1 154
koala koala är inte uppkopplad
Har WN som tidsfördriv
koalas avatar
 
Reg.datum: Sep 2004
Inlägg: 1 154
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?
koala är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-01-14, 00:25 #6
Roberts avatar
Robert Robert är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jan 2004
Inlägg: 2 103
Robert Robert är inte uppkopplad
Klarade millennium-buggen
Roberts avatar
 
Reg.datum: Jan 2004
Inlägg: 2 103
Citat:
Originally posted by etanders@Jan 13 2005, 22:46
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?
Det jag har läst mig till, vilket man själv kan se om man har ett verktyg som visualiserar hur sqlservern kör dina requests, är att du kan formulera dig lite hur du vill; sql servern kommer att utföra dina order på det sätt den finner bäst, vilket oftast är på samma sätt oavsett om du använder JOIN eller WHERE x = y etc. Det går mao inte att "optimera" sina requests genom att byta ut syntax A mot syntax B.

Givetvis är detta inte fallet då du förändrar en syntax till den grad att den betyder något annat. =)
Robert är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-01-14, 10:58 #7
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
Citat:
Originally posted by koala@Jan 14 2005, 00:04
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?
En kollega säger att det finns något extremfall med outer joins och sub-querys som kräver JOIN (där inte WHERE delen räcker till), men han kan inte komma på vad det var så det är bara att betrakta som rykte... :-)

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.
eg0master är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-01-18, 21:20 #8
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
Tvartom Tvartom är inte uppkopplad
Medlem
 
Reg.datum: Oct 2004
Inlägg: 86
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
generarar alla möjliga kombinationer av tabell1 och tabell2 ihopsatta,
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 = ???
och blir således mycket snabbare!

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
Jag komemr dock inte ihåg helt säker skillnaden på INNER och OUTER i joinsatsen. Nån som kan klargöra?

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!)
Tvartom är inte uppkopplad   Svara med citatSvara med citat
Oläst 2005-01-18, 21:42 #9
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
eg0master eg0master är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Oct 2004
Inlägg: 898
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
eg0master ä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 05:40.

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