Avatar billede lsskaarup Nybegynder
01. juni 2007 - 14:31 Der 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.

Tabellerne:
Ordre (basal ordre info)
- id -
- ordre -
- rev -

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.
Avatar billede dkfire Nybegynder
01. juni 2007 - 17:01 #1
Hvad skal tilbudsnummer joines med ??
Avatar billede lsskaarup Nybegynder
03. juni 2007 - 19:07 #2
Hovm ja det glemte jeg at sige, tilbudsnummer kan/skal joins med id fra ordre tabellen og ordreid i aftaler, hvis det er nødvendigt.
Avatar billede lsskaarup Nybegynder
04. juni 2007 - 16:00 #3
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>";
}
Avatar billede lsskaarup Nybegynder
05. juni 2007 - 11:55 #4
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.
Avatar billede lsskaarup Nybegynder
25. juni 2007 - 09:24 #5
Jeg har selv løst problemet, dog er der en noget besynderlig udgang af queryen. Se spg http://www.eksperten.dk/spm/782918
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