förstår inte sql resultat, kan ni förklara mig varför resultaten är så här?

Permalänk

förstår inte sql resultat, kan ni förklara mig varför resultaten är så här?

Jag har tre olika tabeller. De heter deltar, medlemmar och sektioner

deltar tabell

medlemmar tabell

sektioner tabell

jag har prövat köra den här sql koden

select sektioner.namn from sektioner, deltar where skod=sektion;

som resultat får jag en tabell med 5 rader

Enkelt att förstå. Eftersom tabell deltar har 5 rader och där finns två 'A' och 'B' sektioner och en 'C' sektion, självklart resultat är två Bowling, en kickboxing och två komstsimar

men om man lägger till medlemmar tabellen i sql from sats,

select sektioner.namn from sektioner, deltar, medlemmar where skod=sektion;

resultaten ändras så här, 20 rader!

och det kan jag inte förstå. Jag tänkte tabellen medlemmar ska göra ingenting här eftersom som ni ser tabellen medlemmar har inte kolumner som heter skod eller sektion och därför WHERE SKOD = SEKTION kommer aldrig matchas när sql loopar igenom medlemmar. Men resultaten är mycket långt ifrån det som jag har tänkt. 5 rader blev 20 rader. Varför tabell medlemmar påverkar och ändrar resultaten? Varför är det exakt 20 rader ? snälla säg inte 5x4 = 20..

Kolumner skod och sektion är ej foreign nycklar som refererar medlemmar tabell.

Permalänk
Medlem

Som du säger, 5x4 = 20. Då medlemmarna aldrig filtreras bort så kommer du 4 gånger så många träffar, för resultatet behöver även ta med medlemmarna även om du inte visar det i och med din select.
Om du utöker din select till SELECT * FROM... så kommer du se att varje svar utökas, då datan från Medlemmar behöver komma med.

Så även om "Kickboxing" endast ger 1 träff i din första query så kommer den nu ge 4, då den kopieras över för varje medlem då raderna måste fyllas med något. Och de som tidigare gav 2 träffar ger nu 8 (4 medlemmar var).

Som du ser på bilden så utökar du bara resultatet med att lägga till varje medlem, skod är fortfarande lika med sektion. Men då namnen och medlemmarna är unika så måste de skrivas in på separata rader och därför kopieras då resultatet så att alla medlemmar får plats.

Det du nog vill göra egentligen är någon form av JOIN för att specificera datan från varje tabell.

Permalänk
Medlem

kör select * så ser du hela raderna. då kan du lättare se vad du behöver göra where på för att filtrera bort oönskade rader.

det hela har att göra med att för varje tabell du lägger till så kommer den göra en ny rad för varje möjlig kombination.

Visa signatur

CPU: Ryzen 9 3900x Noctua NH-D14 MOBO: TUF Gaming X570-PLUS GPU: GTX 980 RAM: 32 GB 3200 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G502 Lightspeed V.v. nämn eller citera mig för att få svar.

Permalänk
Vila i frid

Beskriv i enkla ord vad ditt exempel är tänk att göra. Förmodligen kommer du att behöva använda "inner join".

Permalänk
Medlem
Skrivet av ProgrammeringElev:

Jag har tre olika tabeller. De heter deltar, medlemmar och sektioner

deltar tabell
https://i.imgur.com/yXByta3.png

medlemmar tabell
https://i.imgur.com/pyKlEfX.png

sektioner tabell
https://i.imgur.com/N39rxPp.png

jag har prövat köra den här sql koden

select sektioner.namn from sektioner, deltar where skod=sektion;

som resultat får jag en tabell med 5 rader
https://i.imgur.com/ym3YikY.png

Enkelt att förstå. Eftersom tabell deltar har 5 rader och där finns två 'A' och 'B' sektioner och en 'C' sektion, självklart resultat är två Bowling, en kickboxing och två komstsimar

men om man lägger till medlemmar tabellen i sql from sats,

select sektioner.namn from sektioner, deltar, medlemmar where skod=sektion;

resultaten ändras så här, 20 rader!
https://i.imgur.com/ju7axbY.png

och det kan jag inte förstå. Jag tänkte tabellen medlemmar ska göra ingenting här eftersom som ni ser tabellen medlemmar har inte kolumner som heter skod eller sektion och därför WHERE SKOD = SEKTION kommer aldrig matchas när sql loopar igenom medlemmar. Men resultaten är mycket långt ifrån det som jag har tänkt. 5 rader blev 20 rader. Varför tabell medlemmar påverkar och ändrar resultaten? Varför är det exakt 20 rader ? snälla säg inte 5x4 = 20..

Kolumner skod och sektion är ej foreign nycklar som refererar medlemmar tabell.

Eftersom du inte begränsar tabellen medlemmar med något, så kommer du hämta ut resultatet från sektioner & deltar för varje medlem - för du har ju sagt att hämta ut sektioner.namn ur tabellen sektioner för varje rad i deltar och medlemmar. Lite därför du får 5 resultat i första anropet - då du får sektioner.namn för varje rad i deltar.

Utökar du då din fråga med att även ta med alla rader från Medlemmar så får du därför deltar * medlemmar antal rader i responset

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB

Permalänk
Hedersmedlem

Är inte detta ett bra tillfälle att använda JOIN?

SELECT s.namn, m.namn FROM deltar as d
LEFT JOIN medlemmar as m ON d.Medlem=m.Mnr
LEFT JOIN sektioner as s ON d.Sektion=s.Skod

Då får du ut en lista med 5 resultat där du ser vem som går i olika sektioner.

(du kan leka med INNER JOIn och LEFT JOIN för att lära dig skillnaderna. testa då att sätta en sektion som inte finns i tabellen deltar).

Visa signatur

-----------------------------------------------------
Ägare/grundare: www.bjorn3d.com

Permalänk
Skrivet av hasenfrasen:

Beskriv i enkla ord vad ditt exempel är tänk att göra. Förmodligen kommer du att behöva använda "inner join".

Bara tentaplugg.. försökte förstå hut sql:en fungerar
och den sqlkoden var exempelkod från boken.
Ordinarie koden är

select Sektioner.Namn from Sektioner, Deltar, Medlemmar where Skod = Sektion and Medlem = Mnr and Medlemmar.Namn ='Olle';

och boken förklarade den kod är samma som

select Namn from Sektioner where Skod in (select Sektioner from Deltar where Medlem in (select Mnr from Medlemmar where Namn = 'Olle'));

Jag fattade andra koden men inte första kod, därför jag delade upp första koden till några delar för att förstå hur det fungerar.
det är allt

Permalänk
Skrivet av zaibuf:

Som du säger, 5x4 = 20. Då medlemmarna aldrig filtreras bort så kommer du 4 gånger så många träffar, för resultatet behöver även ta med medlemmarna även om du inte visar det i och med din select.
Om du utöker din select till SELECT * FROM... så kommer du se att varje svar utökas, då datan från Medlemmar behöver komma med.

Så även om "Kickboxing" endast ger 1 träff i din första query så kommer den nu ge 4, då den kopieras över för varje medlem då raderna måste fyllas med något. Och de som tidigare gav 2 träffar ger nu 8 (4 medlemmar var).

https://i.ibb.co/SX6Dcjr/Capture.png

Som du ser på bilden så utökar du bara resultatet med att lägga till varje medlem, skod är fortfarande lika med sektion. Men då namnen och medlemmarna är unika så måste de skrivas in på separata rader och därför kopieras då resultatet så att alla medlemmar får plats.

Det du nog vill göra egentligen är någon form av JOIN för att specificera datan från varje tabell.

aha tack för beskrivning!
Så..
Enligt min query, from-satsen måste hämta data från Medlemmar också men enligt where villkoren sql kan inte hämta något data från Medlemmar och därför sql(eller databas, vet inte vad är rätt) kopierar tidigare resultat och fyller i. Fattade jag rätt? Om jag ändrar villkoret så att det kan jobba med alla tabeller antal rader kommer bli helt annat?

Permalänk
Medlem

select Namn from Sektioner where Skod in (select Sektioner from Deltar where Medlem in (select Mnr from Medlemmar where Namn = 'Olle'));

Fint med en trenästlad select