01. juni 2007 - 14:31Der er
4 kommentarer og 1 løsning
Hjælp til udforming af query der skal joine flere tabeller
Jeg skal have trukket en oversigt ud til et salgs-/ordrestyrings system, men jeg har nogle problemer med lige at gennemskue hvordan jeg skal skrue løsningen sammen.
Jeg vil lige prøve at forklarer systemet, selvom det er svært.
Vi har en ordre, der kan have flere revisioner, dermed også flere ordreid, hvor ordrenr. dog er det samme. En ordre har også en række aftaler, de ligger tilknyttet til den oprindelige ordre, altså revision 0. (De senere revisioner kender jo deres "forfædre" og referere derfor til "stamfaderen", når aftalerne skal vises).
Det er disse aftaler der skaber hele misseren. For oversigten, skal vise alle ordres seneste revision med data, men de skal udvælges ud fra 2 bestemte type aftaler.
Tabellerne ser sådanne ud, jeg angive kun de vigtigste felter.
Ordre5 (udvidet ordre info) - id - - tilbudsnummer - (det er denne der skal joins på og ikke id, spørg mig ikke hvorfor, sådan var det da jeg overtog systemet...) - r534 - (ordre annulleret = 1, annullerede ordre må ikke blive vidst i oversigten) - r534a - (ordre afsluttet = 1, afsluttede ordre må ikke blive vidst i oversigten)
Aftaler - id - - ordreid - - aktkode - (Den er bl.a. denne der skal udvælges på. Der må kun blive vidst ordre der har aktkoden 225 eller 226)
Håber det var til at forstå. Mit store problem er hvordan jeg får kombineret en query, hvor jeg på én tabel skal lave 2 udtræk der henholdsvis returnere max. id og min. id.
Kan det kun løses vis flere queries kan jeg sagtens acceptere denne løsning.
Hmm, jeg har nu rodet lidt rundt, og prøvede med views, men fandt ud af at v4.1 ikke understøtter dette.
Så prøvede jeg med temporary tables med ikke om den helt virker, for den dræbte godt nok min db. Kan den optimeres hvis den virker?
$nyQuery = "CREATE TEMPORARY TABLE tmpOrdre SELECT ordre, MAX(id) AS maxId, MIN(id) AS minId FROM ordre group by ordre";
mysql_query($nyQuery);
echo $resultatet = "SELECT * FROM tmpOrdre, (SELECT ordreid, SUM(fak_internt) AS sum FROM aftaler WHERE aktkode = 225 OR aktkode = 226 GROUP BY ordreid) AS nyAftaler LEFT JOIN ordre5 AS o5 ON tmpOrdre.maxId = o5.tilbudsnummer LEFT JOIN aftaler ON tmpOrdre.minId = nyAftaler.ordreid";
$nySql = mysql_query($resultatet) or die(mysql_error()); while ($nyFoo = mysql_fetch_array($nySql)) { echo $nyFoo['ordreid'] . "<br>"; }
Okay, jeg har nu fået joinet tabellerne, så jeg har både højeste og laveste id, men mangler én ting.
Oversigten skal vise alle ordrer, men sum skal kun summeres når aftaler har 2 bestemte aktkoder (225 og 226). Hvordan gør jeg lige dette?
Hvis jeg skriver det i WHERE betingelsen, så får jeg jo ikke vist alle ordrer i oversigten.
//Finde hver ordres højeste og leveste id, og oprette en tmp tabel med disse samt ordrenummeret $nyQuery = "CREATE TEMPORARY TABLE tmpOrdrer (ordre int primary key, maxId mediumint, minId mediumint, rev tinyint)";
mysql_query($nyQuery);
//Udfylder temporary table med data $nyQuery = "INSERT INTO tmpOrdrer SELECT ordre, MAX(id) AS maxId, MIN(id) AS minId, MAX(rev) FROM ordre group by ordre";
mysql_query($nyQuery);
//Join temporary table med ordre5 og aftaler tabellerne $resultatet = "SELECT rev, maxId, aftaler.ordreid, r1, r9 AS kunde, ordre, SUM(fak_internt) AS sum, r477 AS sumkg, r477a AS sumstaal, r509a AS staalkrkg, r550 AS leveret, o0.r18 as bygherre, WEEKOFYEAR(o5.r533c) AS lev FROM aftaler LEFT JOIN tmpOrdrer ON aftaler.ordreid = tmpOrdrer.minId LEFT JOIN ordre5 AS o5 ON tmpOrdrer.maxId = o5.tilbudsnummer LEFT JOIN ordre0 AS o0 ON tmpOrdrer.maxId = o0.tilbudsnummer LEFT JOIN ordre4 AS o4 ON tmpOrdrer.maxId = o4.tilbudsnummer $search GROUP BY aftaler.ordreid ORDER BY $sort";
$nySql = mysql_query($resultatet) or die(mysql_error());
$search og $sort er variabler der kan blive sat af brugeren. Så deres navne hentyder er de henholdsvis til where og sortering.
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.