tantenMedlem sedan nov. 20051 596 inlägg Nu vet jag inte riktigt hur jag ska fråga, men mina hästtabeller sätter myror i huvudet på mig... :) Krångliga för en nybörjare
Jag har denna för att få reda på vem som äger vilken häst.
SELECT ägare.namn
FROM ägare, äger, häst, stallad
WHERE häst.namn = 'Gamle Svarten'
AND häst.stallID = stallad.stallID
AND stallad.stallID = äger.stallID
AND äger.ägarID = ägare.ägarID
Vilket fungerar helt som det ska OM hästen inte varit ur träning och kommit tillbaka igen och/eller om det blivit ett hästägarbyte.
Har hästen varit med om bägge sakerna så skrivs det ut fyra rader med ägare som hämtats
från tabell: äger
(2, 2, '2002-04-12', '2004-01-01'); <---Vill inte få med gammal ägare
(2, 3, '2004-01-01', NULL); <---3:an är nye ägaren
och från stallad som berättar att hästen varit där två gånger
(2, '2002-04-12', '2003-03-15');
(2, '2003-09-03', NULL);
Försöka få den att bara hämta null från en av tabellerna kanske?
Men då uppstår problemet när man vill veta vem som ägde häst när den togs ur träning.
(5, '2005-06-01', '2006-07-03')
och då kan man ju inte använda null.
Böckerna jag sitter och slår i verkar ha lösningen på varje sak för sig men inte i kombination med varandra.
Någon som kan ge förslag på "tänk". Behövs det ytterligare tabeller? Eller hur ska jag göra :q :OO
@ndersMedlem sedan juni 200032 969 inlägg Om jag förstår dig rätt borde det räcka bra att istället för inner joins (som det blir iom =-tecknen i din WHERE-sats) använda OUTER JOINS. Exempel:
SELECT ägare.namn
FROM ägare
LEFT JOIN äger ON ägare.ägarID = äger.ägarID
LEFT JOIN stallad ON äger.stallID stallad.stallID
LEFT JOIN häst ON stallad.stallID = häst.stallID
WHERE häst.namn = 'Gamle Svarten'
... och så sitter jag och hoppas att du inte använder Access. :)
Mvh
tantenMedlem sedan nov. 20051 596 inlägg Nej... det blir likadant. Helt rätt för alla hästar som bara haft en hästägare och inte flyttat ut och tillbaka.
Men hästar som både bytt ägare och varit på äventyr får fyra svar... :(
Jag sitter och jobbar med mysql...
@ndersMedlem sedan juni 200032 969 inlägg Ok, då var jag inte helt med. Jag skyller på att jag inte förstår hästsnack...
Jag ska fundera lite.
mvh
aasahMedlem sedan mars 20034 471 inlägg
tanten skrev:
SELECT ägare.namn
FROM ägare, äger, häst, stallad
WHERE häst.namn = 'Gamle Svarten'
AND häst.stallID = stallad.stallID
AND stallad.stallID = äger.stallID
AND äger.ägarID = ägare.ägarID
(2, 2, '2002-04-12', '2004-01-01'); <---Vill inte få med gammal ägare
(2, 3, '2004-01-01', NULL); <---3:an är nye ägaren
och från stallad som berättar att hästen varit där två gånger
(2, '2002-04-12', '2003-03-15');
(2, '2003-09-03', NULL);
Försöka få den att bara hämta null från en av tabellerna kanske?
Nuvarande ägare till en häst som finns i stallet nu: (såld och urTräning är båda NULL).
SELECT A.namn
FROM ägare A, äger AH, häst H, stallad S
WHERE H.namn = 'Gamle Svarten'
AND H.stallID = S.stallID
AND S.stallID = AH.stallID
AND AH.ägarID = A.ägarID
AND S.urTräning = NULL
AND AH.såld = NULL
Men då uppstår problemet när man vill veta vem som ägde häst när den togs ur träning.
(5, '2005-06-01', '2006-07-03')
och då kan man ju inte använda null.
Det här skulle jag lösa med två frågor:
- Vid vilket datum togs hästen ur träning?
- Hitta ägaren i ägare som ägde hästen detta datum.
LarsGMedlem sedan dec. 200012 464 inlägg Varför har du med tabellen stallad i frågan, om du bara vill ha ägare?
AND AH.såld = NULL
är inte giltig SQL-syntax.
AND AH.såld is NULL
tantenMedlem sedan nov. 20051 596 inlägg Nu var det ett tag sedan jag ställde frågan här i wf. Tabellerna ser likadana ut fortfarande, men åäö är borta.
Den här fungerar helt OK på de hästar som finns i stallet:
SELECT hest.namn AS hestnamn, egare.namn AS egarenamn
FROM hest, eger, egare
WHERE hest.stallID = eger.stallID
AND eger.egarID = egare.egarID
AND eger.sold IS NULL
Men jag fick problem när jag skulle fråga om en speciell häst, då snurrade det till sig med för många rader som skrevs ut osv.
I stallad finns det enda stället man kan se om hästen finns kvar i stallet, vilket datum den kom och ev. försvann och att då få reda på vem som är/var ägare, till en häst som kanske inte finns kvar i stallet i dag så måste man väl ha med stallad?
I eger kan man se om hästen har bytt ägare.
Så det kändes naturligt att ha med bägge tabellerna.
Men eftersom jag håller på att lära mig detta så är alla möjliga lösningar sååå välkommna :D
LarsGMedlem sedan dec. 200012 464 inlägg SELECT hest.namn AS hestnamn, egare.namn AS egarenamn
FROM hest, eger, egare
WHERE hest.stallID = eger.stallID
AND eger.egarID = egare.egarID
AND (eger.sold IS NULL
or eger.sold in
(select max(sold)
from eger
where eger.stallid = hest.stallid)
aasahMedlem sedan mars 20034 471 inlägg LarsG, subuttryck funkar väl inte i tidiga MySQL versioner? Vid vilken version börjar det funka?
LarsGMedlem sedan dec. 200012 464 inlägg 4.1 och den har funnits länge
Vid närmare eftertanke behövs det ett villkor till för att inte få flera poster per hest.
SELECT hest.namn AS hestnamn, egare.namn AS egarenamn
FROM hest, eger, egare
WHERE hest.stallID = eger.stallID
AND eger.egarID = egare.egarID
AND (eger.sold IS NULL
or (eger.sold in
(select max(sold)
from eger
where eger.stallid = hest.stallid)
and not exists
(select *
from eger
where sold is null))
tantenMedlem sedan nov. 20051 596 inlägg Måste bara först få säga: Men så kul det är med databaser...
En kunskap ger mig lusten att prova fler frågor och nya möjligheter. Kanske sånt som aldrig kommer behövas på hemsidan... :)
LarsG...
Det fattas en parentes sist i dina förslag... båda
Alla hästar som funnits och finns i stallet kom med i det första förslaget och som du skrev, med fler ägare.
I det andra kom de hästar som finns i stallet med senaste ägare.
Nu ska jag se om jag klarar av att hitta fram till hur jag gör för att få fram Gamle Svarten, med senaste ägare och om han fortfarande finns i träning :OO
select max har jag inte sett förut. Det måste ju gå att prova med sådant som vilken häst sprang in mest pengar den eller den månaden, med den.
Men hur kommer man på att sätta in det i det här sammanhanget med ägarskap? ;)
max(sold)
and not exists :q
Tar nog en stund innan det sjunker in...
Tack så väldans mycket för nya tankegångar. Sååå skoj!