webForumDet fria alternativet

Knepigt att få data från tre tabeller

Databaser & SQL

7 svar · 446 visningar · startad av jonka589

Medlem sedan feb. 20078 inlägg
Frågan#1

Hej!
Jag har ett litet snårigt problem.
Håller på med en ordlista, där vi skriver av olika källor, sparar dessa i redigerat skick och varje ord kan ha ett eller flera betydelser.
Det finns en tabell tbl_kallorna som hanterar källmaterialet, en tabell tbl_ordlistan som hanterar de redigerade orden samt en tabell tbl_betydelse som anger vilka betydelser varje post i ordlistan har.
Dessa tabeller är i sin tur sammanlänkade med två kopplingstabeller. Se bifogad PDF-fil.
Att få kallorna och ordlistan att sitta ihop går finfint:

SELECT
k.PK_uppslagsord_nr, k.UppslagsordK, k.Ordningstal_GOB, k.Ordningstal_OBL, k.Gutamalsformer_GOB,
k.Gutamalsformer_OBL, k.Betydelser_GOB, k.Betydelser_OBL, k.Sida_i_GOB, k.Sida_i_OBL, g.txt_genus, ok.txt_ordklass,
o.GutnisktUppslagsord
FROM
tbl_kallorna k
JOIN tbl_genus g ON k.GenusK =g.PK_genusnr
JOIN tbl_ordklass ok ON k.OrdklassK = ok.PK_ordklassnr
JOIN tbl_koppl_ordlistan_kallorna kok ON k.PK_uppslagsord_nr = kok.PK_uppslagsord_nr
JOIN tbl_ordlistan o ON o.PKordlistanr = kok.PKordlistanr
WHERE k.UppslagsordK LIKE 'un%';

Men när jag sedan ska koppla ihop ordlistan med betydelserna blir det fel och jag får en så kallad Cartesisk produkt, det vill säga jag får alla kombinationer som är möjliga.
Någon som vågar sig på att hjälpa mig? Har funderat på en subquery men vet inte riktigt hur den ska se ut. :l
Jag använder MySQL 5.0.

Tacksam för hjälp och kommentarer :)

Mvh

Jonas

Medlem sedan dec. 200012 464 inlägg
#2

Kan du ge exempel på datainnehåll och förväntat resultat.

Medlem sedan feb. 20078 inlägg
#3

Hej,
Jag vill ha lite data från tbl_kallorna, lite från tbl_ordlistan samt lite från tbl_betydelse.
Exempelvis:
För varje betydelse som hör till ett uppslagsord som börjar på exempelvis un ('un%') vill jag visa uppslagsordet (UppslagsordK), uppslagsordet från ordlistan (GutnisktUppslagsord) .

:)

Medlem sedan dec. 200012 464 inlägg
#4

Använd två frågor då, en för källorna och en för betydelserna.

Medlem sedan feb. 20078 inlägg
#5

Nej, det går tyvärr inte. Frågan ingår som en sökfunktion och det känns lite skakigt att använda att använda exempelvis ResultSet (java.sql.ResultSet) med iteratorer och .next() för att få det att synka. :l
Jag tror en framkomlig väg är att använda en subfråga som generar dels primärnumret för källorna, dels primärnumret för ordlistan och sedan använda dessa nummer för att få fram övrig informationen.
Men kan man namnge de kolumner i tabellen som generas, och i så fall hur? :q

:)

Medlem sedan feb. 20078 inlägg
#6

Tror att jag kanske hittade svaret på min fråga. Jag letade lite på MySQLs hemsida och hittade den hjälp jag tror jag behövde. http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html

SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2);

Så förhoppningsvis löser det sig.

Mvh

Jonas

Medlem sedan feb. 20078 inlägg
#7

Det verkar inte riktigt fungera så som jag tänkt. När jag försökte hängde sig MySQL.
Men jag har en fråga kring JOIN.
Om jag ställer denna fråga får jag 78 svar.

SELECT
k.PK_uppslagsord_nr, k.UppslagsordK, k.Ordningstal_GOB, k.Ordningstal_OBL, k.Gutamalsformer_GOB,
k.Gutamalsformer_OBL, k.Betydelser_GOB, k.Betydelser_OBL, k.Sida_i_GOB, k.Sida_i_OBL, g.txt_genus, ok.txt_ordklass,
o.GutnisktUppslagsord, o.PKordlistanr
FROM
tbl_kallorna k
JOIN tbl_genus g ON k.GenusK =g.PK_genusnr
JOIN tbl_ordklass ok ON k.OrdklassK = ok.PK_ordklassnr
JOIN tbl_koppl_ordlistan_kallorna kok ON k.PK_uppslagsord_nr = kok.PK_uppslagsord_nr
JOIN tbl_ordlistan o ON o.PKordlistanr = kok.PKordlistanr
WHERE k.UppslagsordK LIKE 'te%';

Men när jag ställer denna fråga får jag drygt 1100 svar när jag borde få typ 180 eller så.

SELECT
k.PK_uppslagsord_nr, k.UppslagsordK, k.Ordningstal_GOB, k.Ordningstal_OBL, k.Gutamalsformer_GOB,
k.Gutamalsformer_OBL, k.Betydelser_GOB, k.Betydelser_OBL, k.Sida_i_GOB, k.Sida_i_OBL, g.txt_genus, ok.txt_ordklass,
o.GutnisktUppslagsord, o.PKordlistanr
FROM
tbl_kallorna k
JOIN tbl_genus g ON k.GenusK =g.PK_genusnr
JOIN tbl_ordklass ok ON k.OrdklassK = ok.PK_ordklassnr
JOIN tbl_koppl_ordlistan_kallorna kok ON k.PK_uppslagsord_nr = kok.PK_uppslagsord_nr
JOIN tbl_ordlistan o ON o.PKordlistanr = kok.PKordlistanr
JOIN tbl_koppl_betydelse kb ON kb.PKordlistanr = kok.PKordlistanr
WHERE k.UppslagsordK LIKE 'te%';

men det blir ingen skillnad när jag kör denna fråga

SELECT
k.PK_uppslagsord_nr, k.UppslagsordK, k.Ordningstal_GOB, k.Ordningstal_OBL, k.Gutamalsformer_GOB,
k.Gutamalsformer_OBL, k.Betydelser_GOB, k.Betydelser_OBL, k.Sida_i_GOB, k.Sida_i_OBL, g.txt_genus, ok.txt_ordklass,
o.GutnisktUppslagsord, o.PKordlistanr
FROM
tbl_kallorna k
JOIN tbl_genus g ON k.GenusK =g.PK_genusnr
JOIN tbl_ordklass ok ON k.OrdklassK = ok.PK_ordklassnr
JOIN tbl_koppl_ordlistan_kallorna kok ON k.PK_uppslagsord_nr = kok.PK_uppslagsord_nr
JOIN tbl_ordlistan o ON o.PKordlistanr = kok.PKordlistanr
JOIN tbl_koppl_betydelse kb ON kb.PKordlistanr = kok.PKordlistanr
JOIN tbl_betydelse b ON b.PK_tbl_betyd_NR = kb.PK_tbl_betyd_NR
WHERE k.UppslagsordK LIKE 'te%';

Spelar det någon roll i vilken ordning JOIN dsf ON sadlfkas kommer?
:OO

Medlem sedan feb. 20078 inlägg
#8

Är plötsligt väldigt förvirrad, det kanske inte är något fel på frågan utan det kanske bara är fel på mina data i databasen. Frågorna verkar fungera och i teorin borde det fungera fint. Kan någon våga sig på en kommentar på frågorna? Verkar det logiskt?
:OO

288 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
129 ms — deklarationer (db)
0 ms — hämta statistik (cache)
150 ms — hämta tråd, inlägg och bilagor (db)
135 ms — ändringar (db)