webForumDet fria alternativet

SubQuerys?!?

7 svar · 335 visningar · startad av xrobx

xrobxMedlem sedan mars 2003106 inlägg
#1

Hej alla glada!

Jag kör MySQL 3.23, vilken inte har stöd för subquerys (som jag är van att skriva). Detta är ett problem, då jag inte har möjlighet att
uppdatera MySQL-servern (webbhotell) på egen hand.
På så sätt måste jag försöka skriva om mina querys med
JOIN-strukturer i stället för Subquerys. Är det någon som kan hjälpa mig
att översätta följande query till en med JOIN i stället?

(Jag är inte så haj på SQL för övrigt... :x)

Bakgrundsinfo:
Jag vill visa de personer ur personalen (tblPersonal) som
inte är uppbokade på jobb mellan två datum (StartDatum och SlutDatum)

SELECT p.PersonalID, p.Fornamn, p.Efternamn FROM tblPersonal p
WHERE p.PersonalID NOT IN(
                           select pb.PersonalID from tblPersonalBokning pb, tblBokning b 
                           where pb.BokningsID = b.BokningsID
                           AND b.StartDatum  <=  #2004-06-10#
                           AND b.SlutDatum   >=  #2004-06-08#
                          )

Mycket tacksam för hjälp! :)

xrobxMedlem sedan mars 2003106 inlägg
#2

Nu har jag försökt att knappra ihop en variant av ovanstående SQL-fråga med JOIN´s.

Problemet är det att jag inte fattar hur jag får ut svaret
från SQL-frågan här under i omvänd ordning..
Alltså, jag vill att frågan ska returnera
all Personal förutom dem som min fårga nu returnerar...
Nu blev det krångligt, hoppas ni förstår vad jag menar :)

SELECT DISTINCT p.PersonalID, p.Fornamn, p.Efternamn
FROM tblPersonal p
RIGHT JOIN tblPersonalBokning pb ON p.personalID = pb.PersonalID
LEFT JOIN tblBokning b ON pb.BokningsID = b.BokningsID 

WHERE      b.StartDatum  <=  '2004-06-21'
AND        b.SlutDatum   >=  '2004-06-19'
LarsGMedlem sedan dec. 200012 464 inlägg
#3
SELECT p.PersonalID, p.Fornamn, p.Efternamn 
  FROM tblPersonal p
  left join tblPersonalBokning pb
  on p.PersonalID = pb.PersonalID 
  left join tblBokning b 
  on pb.BokningsID = b.BokningsID
  AND b.StartDatum  <=  '2004-06-10'
  AND b.SlutDatum   >=  '2004-06-08'
  where pb.personalID is null

Flyttas från Mysql

xrobxMedlem sedan mars 2003106 inlägg
#4

Tack för ditt svar!

Det verkar dock fortfarande inte fungera som jag tänkt mig.
Jag vet inte om det har med min databas att göra men
din fråga returnerar samma svar oberoende av vilka
parametrar man skickar med, skumt.. Det spelar alltså ingen roll
vad jag sätter StartDatum eller SlutDatum till, som svar
får jag hela tiden samma poster.

Det kanske har med min tabell-specifikation att göra "Allow Null" osv...?

Mvh
Robban

PDahlenMedlem sedan apr. 2004778 inlägg
#5

Har du ändrat du datumen i SQL-frågan ovan till parametrar då?

xrobxMedlem sedan mars 2003106 inlägg
#6

Ja det har jag gjort.
Jag har testat med flera olika datum, inklusive datum där jag
är 100% säker på att det inte finns några bokningar.

LarsGMedlem sedan dec. 200012 464 inlägg
#7

Kan du posta tabellbeskrivningar, lite exempeldata och förväntat resultat.

xrobxMedlem sedan mars 2003106 inlägg
#8

Gärna :)

Tabellstrukturer:

tblBokning:
Fält / Typ / Null / Standard
----------------------------------------------------------
BokningsID/ int(11)/ Nej/ 0
StartDatum/ date/ Ja / NULL
SlutDatum/ date/ Ja/ NULL

tblPersonalBokning:
Fält / Typ / Null / Standard
----------------------------------------------------------
BokningsID/ int(11)/ Nej/ 0
PersonalID/ int(11)/ Nej/ 0

tblPersonal:
Fält/ Typ/ Null/ Standard
----------------------------------------------------------
PersonalID/ int(11)/ Nej/ 0
Fornamn/ varchar(20)/ Ja/ NULL
Efternamn/ varchar(20)/ Ja/ NULL

Exempel:
Tabellen tblBokning innehåller en post med BokningsID 1,
StartDatum "2004-06-06" och SlutDatum "2004-06-10".

Jag har lagt till 2 poster i tabellen tblPersonalBokning
där båda posterna har BokningsID 1 och ena posten har PersonalID 1, och andra posten har PersonalID 2.
Alltså, personal med ID 1 och ID 2 är uppbokade från
"2004-06-06" till "2004-06-10".

Tabellen tblPersonal innehåller 10 poster med olika personal.

När jag kör frågan:

SELECT p.PersonalID, p.Fornamn, p.Efternamn 
  FROM tblPersonal p
  left join tblPersonalBokning pb
  on p.PersonalID = pb.PersonalID 
  left join tblBokning b 
  on pb.BokningsID = b.BokningsID
  AND b.StartDatum  <=  '2004-06-10'
  AND b.SlutDatum   >=  '2004-06-06'
  where pb.personalID is null

vill jag att den returnerar de 8 poster med personal
som inte är uppbokade under "2004-06-06" till "2004-06-10".
Frågan returnerar i dagsläget, oberoende av vilka datum jag sätter i frågan, de poster som inte förekommer
i tabellen tblPersonalBokning.

Hoppas ni förstår vad jag menar! :)

135 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)