09. januar 2008 - 22:34Der 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
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
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"
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
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.
Jeg har fundet en løsning via en anden tabel. Tak for hjælpen. Jeg lukker spørgsmålet.
Synes godt om
Ny brugerNybegynder
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.