webForumDet fria alternativet

Group by?

5 svar · 380 visningar · startad av Skarre

SkarreMedlem sedan apr. 20012 447 inlägg
#1

MySQL < 5

Hjärnsläpp! Jag har arbetsorder i tabellen "ord_workorders" och tillhörande rapporter i "ord_reports". En arbetsorder kan ha flera rapporter kopplade till sig, ord_workorders.id = ord_reports.workorderid.

Nu vill jag hämta alla arbetsorder vars samtliga rapporter är fakturerade (invoiced = 1), men jag har som sagt hjärnsläpp och behöver lite vägledning. Med nedan fråga får jag även med arbetsorder som bara har någon enstaka rapport fakturerad. Jag kan dessvärre inte köra subqueries eftersom mysql-versionen på servern inte fattar sådana.

SELECT * FROM ord_workorders o 
INNER JOIN ord_reports r ON o.id = r.workorderid
WHERE r.invoiced  = 1
GROUP BY o.id
ORDER BY r.reportdate DESC
CssonMedlem sedan feb. 2000314 inlägg
#2

Funkar det bättre om du vänder på det: WHERE r.invoiced != 0 ?

SkarreMedlem sedan apr. 20012 447 inlägg
#3

Nope, det är något grundläggande fel i frågan, det ser jag själv, men jag så pass kass på sql att jag inte kan göra någonting åt det. :(

LarsGMedlem sedan dec. 200012 465 inlägg
#4
SELECT o.* 
 FROM ord_workorders o 
  left JOIN ord_reports r 
    ON o.id = r.workorderid
   and r.invoiced <> 1
 where r.workorderid is null
SkarreMedlem sedan apr. 20012 447 inlägg
#5

Tack ska du ha, Lars! Det uppskattas.

SkarreMedlem sedan apr. 20012 447 inlägg
#6

Jag har försökt modifiera frågan (utan framgång) eftersom den nu även hittar arbetsorder som inte har några rapporter. Det jag vill hämta är alla arbetsorder som har minst en rapport och vars samtliga rapporter är fakturerade.

RED: Ok, detta är vad jag fått fram.

SELECT o.*
FROM (ord_workorders o INNER JOIN ord_reports r1 ON o.id = r1.workorderid)
LEFT JOIN ord_reports r2 ON o.id = r2.workorderid AND r2.invoiced <> 1
WHERE r2.workorderid IS NULL
GROUP BY o.id

Jag joinade ord_reports med en "inner join" först, för att se till att det fanns rapporter kopplade till ordern, och sedan en gång till med Lars ursprungliga left join. Det vore dock kanon om någon kunde kolla på frågan och verifiera att det blivit rätt. Det verkar fungera, men som sql-novis blir man lite osäker ibland.

Genererad på 381 ms · cache AV · v20260730165559-full.f96bc7eb