Avatar billede michaelgm Nybegynder
09. januar 2008 - 22:34 Der er 8 kommentarer og
1 løsning

Join på flere felter

Sådan her ser min sql ud nu:

SELECT DISTINCT
va.PERSONNUMMER,
DATE_FORMAT(va.STARTTID,'%H:%i') AS TID,
va.VAGT,
vd.VOGNLOB,
vd.STED,
vd.TYPETUR,
vd.VAGT1,
vd.VAGT2,
vd.VAGT3,
vd.VAGT4,
vo.BUS,
vs.busnr,
vd.TID AS vdtid,
person.NAVN,
DATE_FORMAT(modelog.modt,'%H:%i') AS modt,
post.besked
FROM
vagt AS va
Inner Join vogndata AS vd ON
va.VAGT = vd.VAGT
AND vd.PLANPERIODE = '$periodenr'
AND vd.CHECKPUNKT = 'Gar'
AND vd.STED = 2
AND vd.TYPETUR = 3
Left Outer Join vognlob AS vo ON vd.VOGNLOB = vo.VOGNLOB AND vo.PLANPERIODE = '$periodenr'
Left Join vaerksted.skiftbus AS vs ON vd.VOGNLOB = vs.vognlob AND vs.aktiv = 'j' AND vs.startdato = '$sqldato' AND vs.starttid <= vd.TID AND vs.sluttid >= vd.TID
left Join person ON person.NUMMER = va.PERSONNUMMER
left Join modelog ON person.NUMMER = modelog.chrnr AND modelog.dato = va.DATO AND modelog.vagt = va.VAGT
left Join post ON post.modtager = va.PERSONNUMMER AND SUBSTR(post.dato,1,10)= va.DATO AND post.udkorsel = 'j'
WHERE
va.DATO =  '$sqldato'
GROUP BY
va.PERSONNUMMER
ORDER BY
va.STARTTID ASC,
vd.TID


-------------------------------

Mit spørgsmål er hvordan vil jeg kunne finde en vagt der enten ligger i vd.VAGT, vd.VAGT1, vd.VAGT2, vd.VAGT3, vd.VAGT4

finder den der er i vd.VAGT sådan her, for der vil altid være en vagt:

Inner Join vogndata AS vd ON
va.VAGT = vd.VAGT
AND vd.PLANPERIODE = '$periodenr'
AND vd.CHECKPUNKT = 'Gar'
AND vd.STED = 2
AND vd.TYPETUR = 3

Men som sagt kan den enkle vagt en en ud af de 5 felter. vagt1, vagt2 osv.

Det er ikke sikkert der står noget noget i vd.VAGT1 - vd.VAGT4
Avatar billede arne_v Ekspert
10. januar 2008 - 00:41 #1
1)

Dårlig tabel struktur.

Den bør rettes !


2)

prøv:

Inner Join vogndata AS vd ON
(va.VAGT = vd.VAGT OR va.VAGT = vd.VAGT OR va.VAGT = vd.VAGT1 OR va.VAGT2 = vd.VAGT3 OR va.VAGT = vd.VAGT4)
Avatar billede michaelgm Nybegynder
10. januar 2008 - 15:56 #2
Ja det vil jeg give dig ret i.
Problemet er jeg ikke selv har oprettet tabeller. Det kommer fra et andet program.

Tror du man ville kunne starte fra vogndata og så lave subselect på vagt1 osv hvis de ikke er NULL?

og så sortere hvor dato i vagt.DATO = idag

Det jeg er ved at lave er en udkørselsliste. Og fordi de ligger i vagt1, 2 osv er fordi de køre med samme bus eller personalebil ud til en anden bus.

Vil det gøre det nemmere?
Avatar billede michaelgm Nybegynder
15. januar 2008 - 14:19 #3
Det virkede ikke med (va.VAGT = vd.VAGT OR va.VAGT = vd.VAGT OR va.VAGT = vd.VAGT1 OR va.VAGT2 = vd.VAGT3 OR va.VAGT = vd.VAGT4)

Nogen der har et forslag?
Avatar billede kjulius Novice
26. januar 2008 - 16:54 #4
Tja, hvad om du brugte en UNION ALL til at opbygge en "mellemfil". Noget ala:

SELECT DISTINCT va.PERSONNUMMER, DATE_FORMAT(va.STARTTID,'%H:%i') AS TID, va.VAGT, vd.VOGNLOB, vd.STED, vd.TYPETUR, vd.VAGT1, vd.VAGT2, vd.VAGT3, vd.VAGT4, vo.BUS, vs.busnr, vd.TID AS vdtid, person.NAVN, DATE_FORMAT(modelog.modt,'%H:%i') AS modt, post.besked
FROM vagt AS va
Inner Join (
  SELECT VOGNLOB, STED, TYPETUR, VAGT1 AS VAGT, CAST(1 AS INTEGER) AS VAGTFELT
  FROM vogndata
  WHERE VAGT1 IS NOT NULL
  UNION ALL
  SELECT VOGNLOB, STED, TYPETUR, VAGT2 AS VAGT, CAST(2 AS INTEGER) AS VAGTFELT
  FROM vogndata
  WHERE VAGT2 IS NOT NULL
  SELECT VOGNLOB, STED, TYPETUR, VAGT3 AS VAGT, CAST(3 AS INTEGER) AS VAGTFELT
  FROM vogndata
  WHERE VAGT1 IS NOT NULL
  UNION ALL
  SELECT VOGNLOB, STED, TYPETUR, VAGT4 AS VAGT, CAST(4 AS INTEGER) AS VAGTFELT
  FROM vogndata
  WHERE VAGT2 IS NOT NULL
  ) AS vd
  ON va.VAGT = vd.VAGT
AND vd.PLANPERIODE = '$periodenr'
AND vd.CHECKPUNKT = 'Gar'
AND vd.STED = 2
AND vd.TYPETUR = 3
Left Outer Join vognlob AS vo ON vd.VOGNLOB = vo.VOGNLOB AND vo.PLANPERIODE = '$periodenr'
Left Join vaerksted.skiftbus AS vs ON vd.VOGNLOB = vs.vognlob AND vs.aktiv = 'j' AND vs.startdato = '$sqldato' AND vs.starttid <= vd.TID AND vs.sluttid >= vd.TID
left Join person ON person.NUMMER = va.PERSONNUMMER
left Join modelog ON person.NUMMER = modelog.chrnr AND modelog.dato = va.DATO AND modelog.vagt = va.VAGT
left Join post ON post.modtager = va.PERSONNUMMER AND SUBSTR(post.dato,1,10)= va.DATO AND post.udkorsel = 'j'
WHERE va.DATO =  '$sqldato'
GROUP BY va.PERSONNUMMER
ORDER BY va.STARTTID ASC, vd.TID
Avatar billede kjulius Novice
26. januar 2008 - 16:56 #5
Det skal naturligvis være VAGT3 og VAGT4 der selekteres på i de sidste to dele af UNION ALL. Beklager typo'en. :-(
Avatar billede michaelgm Nybegynder
29. januar 2008 - 14:56 #6
Undskyld jeg er så langsom til at få svaret for du har jo gjordt et kæmpe arbejde for at sætte dig ind i det. Men får desværre denne fejl:

"1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for right syntax to use near 'INGTEGER) AS VAGTFELT
FROM vogndata
WHERE VAGT1 IS NOT NULL
UNION ALL
' at linie 4"
Avatar billede kjulius Novice
31. januar 2008 - 01:27 #7
Nej, det er mig der skal undskylde, for jeg har faktisk ikke brugt mange minutter på opgaven og har vist ikke sat mig rigtigt ind i syntaxen, der bruges af MySQL. I stedet for INTEGER skal man iflg. manualen angive om der er tale om en SIGNED eller UNSIGNED integer. Prøv derfor at erstatte INTEGER med enten SIGNED eller UNSIGNED (i dette tilfælde er typen egentlig ligegyldig) - eller udelad helt feltet, det er mest for at indikere fra hvilket felt værdien tages, men da det ikke bruges i det videre forløb kan det egentlig lige så godt droppes:

SELECT DISTINCT va.PERSONNUMMER, DATE_FORMAT(va.STARTTID,'%H:%i') AS TID, va.VAGT, vd.VOGNLOB, vd.STED, vd.TYPETUR, vd.VAGT1, vd.VAGT2, vd.VAGT3, vd.VAGT4, vo.BUS, vs.busnr, vd.TID AS vdtid, person.NAVN, DATE_FORMAT(modelog.modt,'%H:%i') AS modt, post.besked
FROM vagt AS va
Inner Join (
  SELECT VOGNLOB, STED, TYPETUR, VAGT1 AS VAGT
  FROM vogndata
  WHERE VAGT1 IS NOT NULL
  UNION ALL
  SELECT VOGNLOB, STED, TYPETUR, VAGT2 AS VAGT
  FROM vogndata
  WHERE VAGT2 IS NOT NULL
  SELECT VOGNLOB, STED, TYPETUR, VAGT3 AS VAGT
  FROM vogndata
  WHERE VAGT3 IS NOT NULL
  UNION ALL
  SELECT VOGNLOB, STED, TYPETUR, VAGT4 AS VAGT
  FROM vogndata
  WHERE VAGT4 IS NOT NULL
  ) AS vd
  ON va.VAGT = vd.VAGT
AND vd.PLANPERIODE = '$periodenr'
AND vd.CHECKPUNKT = 'Gar'
AND vd.STED = 2
AND vd.TYPETUR = 3
Left Outer Join vognlob AS vo ON vd.VOGNLOB = vo.VOGNLOB AND vo.PLANPERIODE = '$periodenr'
Left Join vaerksted.skiftbus AS vs ON vd.VOGNLOB = vs.vognlob AND vs.aktiv = 'j' AND vs.startdato = '$sqldato' AND vs.starttid <= vd.TID AND vs.sluttid >= vd.TID
left Join person ON person.NUMMER = va.PERSONNUMMER
left Join modelog ON person.NUMMER = modelog.chrnr AND modelog.dato = va.DATO AND modelog.vagt = va.VAGT
left Join post ON post.modtager = va.PERSONNUMMER AND SUBSTR(post.dato,1,10)= va.DATO AND post.udkorsel = 'j'
WHERE va.DATO =  '$sqldato'
GROUP BY va.PERSONNUMMER
ORDER BY va.STARTTID ASC, vd.TID
Avatar billede michaelgm Nybegynder
10. februar 2008 - 11:56 #8
kjulius:

Jeg kan sagtens se idéen i det du skriver. Og har prøvet og lege med det en del dage nu.. Men får den ikke ned under 8000 rækker.. Og der er kun 50-100 stk'er der køre ud om dagen.

Er det noget jeg kan lokke dig til at hjælpe med en dag?
kan sende dig nogen sql dumps.
Er os villig til at betale for at få den lavet.
Avatar billede michaelgm Nybegynder
13. februar 2008 - 20:28 #9
Jeg har fundet en løsning via en anden tabel. Tak for hjælpen. Jeg lukker spørgsmålet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester