Avatar billede lsskaarup Nybegynder
13. juni 2007 - 14:54 Der er 4 kommentarer og
1 løsning

Ordre returneres kun i den ene forespørgelse

Jeg undre mig lidt over et problem jeg har, men måske er det bare fordi jeg ikke kan se skoven for bare træer.

Jeg har en ordreoversigt, der viser en masse ordre. For at kunne få alle data for join'er jeg 5 tabeller, hvori 2 er temporary.

Det mærkelige er at jeg har en ordre, som ikke vises i den samlede over sigt, men når jeg søger specifikt efter det ordre-nummer, så får jeg vist ordren. Den eneste forskel i query skulle være i WHERE delen.

---- query til den samlede oversigt ---

SELECT rev, maxId, aftaler.ordreid, r1, r9 AS kunde, ordre, tmpSum, r477 AS sumkg, r477a AS sumstaal, r509a AS staalkrkg, r550 AS leveret, o0.r18 as bygherre, WEEKOFYEAR(o5.r533c) AS lev, r575a FROM aftaler RIGHT 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 LEFT JOIN tmpAftaler AS ta ON tmpOrdrer.minId = ta.ordreAftale WHERE r534a != 1 GROUP BY aftaler.ordreid ORDER BY ordre ASC

--- query, hvor der er søgt efter ordre 42215, som ikke returneres i den samlede oversigt ---

SELECT rev, maxId, aftaler.ordreid, r1, r9 AS kunde, ordre, tmpSum, r477 AS sumkg, r477a AS sumstaal, r509a AS staalkrkg, r550 AS leveret, o0.r18 as bygherre, WEEKOFYEAR(o5.r533c) AS lev, r575a FROM aftaler RIGHT 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 LEFT JOIN tmpAftaler AS ta ON tmpOrdrer.minId = ta.ordreAftale WHERE r534a != 1 && ordre='42215' GROUP BY aftaler.ordreid ORDER BY ordre ASC
Avatar billede kjulius Novice
13. juni 2007 - 23:46 #1
Det ser godt nok mærkeligt ud. Så vidt jeg kan se, er der ganske rigtigt ikke anden forskel end selektionen på ordre feltet.

Hvilken tabel kommer feltet ordre fra?
Avatar billede lsskaarup Nybegynder
14. juni 2007 - 08:32 #2
Det kommer fra tmpOrdrer, som jeg skaber via

//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";
Avatar billede kjulius Novice
14. juni 2007 - 19:30 #3
Jeg synes slet ikke jeg kan se det!
Hmm... en lille ting som jeg ikke kan lide, men som på den anden side ikke skulle gøre nogen forskel:

Da det er tmpOrdrer der er den primære tabel med de andre som LEFT/RIGHT OUTER JOINS, burde det være tmpOrdrer.MinId der bruges i GROUP BY (og i SELECT).

Men bortset den lille indvending, kan jeg ikke få øje på noget "snavs".
Avatar billede lsskaarup Nybegynder
14. juni 2007 - 20:11 #4
Måske, måske ikke. Den eneste grund til jeg har tmpOrdrer er fordi jeg skal bruge både det højeste og laveste id for hver ordre.

Grunden til dette, er at alle aftaler ligger på den første ordre, og der med laveste id. En ordre kan dog godt have revisioner, og i oversigten skal brugerne kunne klikke på ordrenummeret og få åbnet den seneste revision.

Den samlede pris, aftalerne på den første ordre giver, skal dog også vises på oversigten.

Jeg ved ikke om det kunne gøres på en smartere og nemmere måde, men det ser ud til at virke. bort set fra, at den altså ikke returnere alle records i den "store" query.

Det er bare mærkeligt, at det i dette tilfælde er en ordre, der ligger midt i udtrækket, og ikke sidst. Det e som om den bare springer over nogle ordre undervejs.
Avatar billede lsskaarup Nybegynder
28. november 2007 - 10:48 #5
Jeg må hellere lukke, kan faktisk ikke huske hvad løsningen blev.
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