WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   SELECT från två tabeller (https://www.wn.se/forum/showthread.php?t=1049360)

Hellsing 2011-08-02 12:12

SELECT från två tabeller
 
Hej

Jag försöker få ut 2 värden från två olika tabeller med en SELECT sats.

Tabell 1
id
username

Tabell 2
user_id
field_id
value

id i tabell 1 är samma värde som user_id i tabell 2

Jag vill få ut användarnamn från tabell 1 med tillhörande value där field_id är 20.

Jag har provat:
SELECT b.username, f.field_id, f.value FROM tabell1 b INNER JOIN tabell2 f ON b.id = f.user_id WHERE f.field_id = 20

och:
SELECT tabell1.username, tabell2.field_id, tabell2.value FROM tabell1, tabell2 WHERE tabell2.field_id = 20 ORDER BY tabell2.value DESC LIMIT 5

foks 2011-08-02 12:17

SELECT tabell1.username, tabell2.field_id, tabell2.value FROM tabell1, tabell2 WHERE tabell2.field_id = 20 AND tabell1.id = tabell2.user_id ORDER BY tabell2.value DESC LIMIT 5

Hellsing 2011-08-02 12:44

Citat:

Ursprungligen postat av foks (Inlägg 20413347)
SELECT tabell1.username, tabell2.field_id, tabell2.value FROM tabell1, tabell2 WHERE tabell2.field_id = 20 AND tabell1.id = tabell2.user_id ORDER BY tabell2.value DESC LIMIT 5

Perfekt! Tackar =)

teamweb 2011-08-02 12:47

Ursäkta att jag snor tråden men min fråga är ungefär densamma. Jag provade föreslagen sql på min databas men jag fick inte önskat utfall.

Mina tabeller ser ut som följer
Tabell "Distrikt"
distrikt int
namn varchar (län)
...

Tabell "Kunder"
orgnummer int
lan varchar (län)
...

I tabellen distrikt har vi 77 poster. Ett distrikt (1) innehåller Östergötland och Jönköping. Distrikt 2 innehåller andra län/städer.

I tabellen kunder har vi flera som "finns" i Östergötland och Jönköping. Men med mina frågor får jag bara ut endera läns kunder. Jag vill alltså att när jag väljer distrikt 1 få ut kunder som tillhör både Jönköping och Östergötland.

select distinct orgnummer,lan from Kunder
right JOIN (select namn,distrikt from Distrikt) as d
ON d.namn = Kunder.lan
where d.distrikt = 1

Någon som har ett förslag?

teamweb 2011-08-02 16:03

[Löst]
 
Löste mitt problem med följande sql. Det behövdes ingen JOIN utan en selectsats i where.

select distinct orgnummer,lan FROM Kunder
WHERE Kunder.lan in((select namn from Distrikt where distrikt = 1))

Conny Westh 2011-08-03 04:10

Citat:

Ursprungligen postat av foks (Inlägg 20413347)
SELECT tabell1.username, tabell2.field_id, tabell2.value FROM tabell1, tabell2 WHERE tabell2.field_id = 20 AND tabell1.id = tabell2.user_id ORDER BY tabell2.value DESC LIMIT 5

Den information som finns i första inlägget räcker inte för att lösa uppgiften. Det finns ingen information om Primärnycklar. TS skriver bara att user_id i tabell 2 är samma som i tabell 1, det kan man i bästa fall tolka som att tabell2.user_id är en främmande nyckel till tabell1.id som PK, men det finns ingen info om vilken PK som tabell 2 har.

Det kan finnas en risk för bugg här om det inte finns en PK i tabell 2.

MRDJ 2011-08-04 11:58

Citat:

Ursprungligen postat av teamweb (Inlägg 20413362)
Löste mitt problem med följande sql. Det behövdes ingen JOIN utan en selectsats i where.

select distinct orgnummer,lan FROM Kunder
WHERE Kunder.lan in((select namn from Distrikt where distrikt = 1))

jag hade nog föredragit att köra en JOIN om det går, denna lösning med en subquery gör att det ställs en fråga för varje rad.

något sådant här kanske?
SELECT d.distinct, k.orgnummer,lan FROM Kunder k
INNER JOIN district d ON k.lan = d.namn AND d.distrikt = 1

tartareandesire 2011-08-04 19:03

Citat:

Ursprungligen postat av teamweb (Inlägg 20413362)
Löste mitt problem med följande sql. Det behövdes ingen JOIN utan en selectsats i where.

select distinct orgnummer,lan FROM Kunder
WHERE Kunder.lan in((select namn from Distrikt where distrikt = 1))

Subqueries bör normalt sett undvikas om möjligt så även i ditt fall.


Alla tider är GMT +2. Klockan är nu 03:31.

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