Avatar billede doncarnage Nybegynder
27. oktober 2010 - 13:51 Der er 6 kommentarer og
1 løsning

Sortere ud fra en række, som man får udskrevet i nogle løkker

Hej eksperter..

På en side får jeg udskrevet nogle sammenlagte beløb, der bliver trukket ud gennem flere tabeller med forskellige relationer. Det fungerer som det skal og ser ud som nedenstående:

$sql = "SELECT * FROM tbl_transactionsgroup INNER JOIN tbl_transactions ON tbl_transactionsgroup.TransactionGroupID = tbl_transactions.TransactionGroupID INNER JOIN tbl_customer ON tbl_transactions.CustomerID = tbl_customer.CustomerID INNER JOIN tbl_employee ON tbl_employee.employeeID = tbl_transactions.EmployeeID WHERE Temp = 0 GROUP BY tbl_transactionsgroup.TransactionGroupID ORDER BY DateYear DESC, DateMonth DESC, DateDay DESC, tbl_transactions.TransactionGroupID DESC";

$queryfaktura = mysql_query($sql);

while ($rowfaktura = mysql_fetch_assoc($queryfaktura)) {

$queryfakturapris2 = mysql_query("SELECT SUM(TotalPrice) AS pris FROM tbl_transactions WHERE TransactionGroupID = '".$rowfaktura['TransactionGroupID']."' AND Temp = 0 GROUP BY TransactionGroupID") or die(mysql_error());

  while ($rowfakturapris = mysql_fetch_assoc($queryfakturapris2)) {
    echo $rowfakturapris['pris'];
  }

}



Problemet er bare at jeg gerne vil have den til at sortere den første query ($sql) ud fra den udskrevne $rowfakturapris['pris'] i den sidste løkke, da jeg skal bruge det et andet sted på siden, hvor man gerne skal kunne sortere efter pris.. Men hvordan gør jeg lige det?

Jeg tænkte lidt at man kunne den øverste query inden i den sidste løkke og så smide en SORT BY $rowfakturapris['pris'] ind, men det havde jeg desværre ingen held med... HELP :S
Avatar billede Authiel Nybegynder
27. oktober 2010 - 14:52 #1
Kunne det måske være fordi at det hedder ORDER BY?
27. oktober 2010 - 14:57 #2
Jeg finder det svaert at forholde mig til hvad det er du oensker.  Du kommer nok til at forklare lidt naermere.  Lad mig foretage et par observationer: 

Din foerste query finder, ser det ud til, transactionsgrupper hvor Temp=0 (hvad det saa betyder) og som er 'aktive' d.v.s. har baade customers og employees tilknyttede. Du faar en raekke per transactionsgruppe.  Paa en eller anden maade (som jeg ikke lige kan indse hvordan) maa et af felterne i denne raekke vaere TotalPrice per transactiongroup.

Hvis det er korrekt, saa burde du kunne spare din anden query som ikke goer andet end at gruppere transactiongrupperne der allerede er grupperede per transactiongruppe og at foretage en sum af TotalPrice der allerede er summeret.

Det ville forekomme mig mere logisk hvis den foerste query ikke grupperes per transactionsgruppe. Et af felterne i en af tabellerne, maaske i transactions, er saa TotalPrice (for den transaction.)  Vil du saa have transactions sorteret per pris eller vil du have totaler per transactiongroup saaledes at transactionsgroups med den hoejeste omsaetning staar oeverst?  Det kan altsammen lade sig goere saa snart det er klart hvad du har brug for.

Fortael lidt mere, klargoer hvor i tabellerne du har priser, og klargoer hvad du bruger queryerne til og hvad du vil opnaa.
27. oktober 2010 - 14:59 #3
Ja, og SORT BY skulle vaere ORDER BY, men du ville saa proeve at ordne/sortere det foerste query ved hjaelp af et kriteria du finder i dit andet query som bruger criteria fra det foerste query, en cirkel-query.
Avatar billede doncarnage Nybegynder
27. oktober 2010 - 17:26 #4
Jeg har naturligvis prøvet med ORDER BY.. Det var en tastefejl at jeg skrev SORT BY, da det skulle gå hurtigt ;)


Christian_Belgien:

I min første query ($queryfaktura) henter jeg "Dato, Ansvarlig, Kunde og Id på faktura" ud fra de forskellige tabeller som du kan se med mine mange innerjoins.. Grunden til at jeg ikke har smidt den anden query ($queryfakturapris2) sammen med den første er pga. jeg inde i min anden query beregner prisen ud fra første querier's TransactionGroupID kolonne.. Er ikke lige klar over om det er en hjernedød måde at gøre det på eller ej :S

Men TotalPrice ligger rigtig nok som du siger i tbl_transactions, og her bliver de så lagt sammen hvis de har det samme TransactionGroupID. Jeg vil derfor gerne have at den sorterer ud fra den SUM(TotalPrice)

Håber det er til at forstå? Ellers så spørg endelig igen og jeg skal forsøge at forklare/illustrere nærmere ;)
27. oktober 2010 - 19:37 #5
Det kan vaere det er mig der er lidt hjernedoed, for jeg kan ikke se hvordan i den foerste query TotalPrice bliver lagt sammen per transactiongroup.  Jeg kan ikke engang se at din foerste query henter Dato, Ansvarlig, o.s.v. fra de forskellige tabeller, kun de foerste vaerdier for hver transactiongroup.  Lad mig ved hjaelp af et eksempel forklare hvordan jeg forstaar din foerste query.  For at holde det simpelt bruger jeg kun disse to tabeller med de foelgende vaerdier:

tbl_transactiongroup
id groupnavn
1  kreditsalg
2  kontantsalg

tbl_transactions
id pris transnavn transgroup
1  2,34 transnavn1 1
2  5,12 transnavn2 1
3  5,00 transnavn3 2
4  5,50 transnavn4 2

Med kun de to tabeller bliver din foerste query kortere:

SELECT * FROM tbl_transactiongroup tg INNER JOIN tbl_transactions t ON tg.id = t.transgroup GROUP BY tg.id

Resultatet bliver to raekker, en for hver tbl_transactiongroupid.  I hver raekke faar du kun pris og navn for en af de transactions der hoerer til, saaledes:

id groupnavn id pris transnavn transgroup
1  kreditsalg 1 2,34 transnavn1 1
2  kontantsalg 3 5,00 transnavn3 2

Naar du i den query grupperer per transactiongroup smider du saaledes alle priser, navne, o.s.v., vaek undtagen en per transactiongroup.  Jeg har svaert ved at tro at det er din hensigt.

Det jeg gaetter du har brug for er to queries der ikke afhaenger af hinanden.  Naar du har brug for detaljer bruger du for eksempel denne:

SELECT tg.id, tg.groupnavn, t.id, t.pris, t.transnavn
FROM tbl_transactiongroup tg
INNER JOIN tbl_transgroup"ON tg.id = t.transgroup
ORDER BY tg.id, t.id;

Naar du har brug for totalprisen per transactiongroup, maaske sorteret per pris, bruger du denne:

SELECT SUM(pris) AS pris
FROM tbl_transactiongroup tg
INNER JOIN tbl_transgroup"ON tg.id = t.transgroup
GROUP BY tg.id
ORDER BY SUM(pris)

Jeg er spaendt paa din reaktion til det ovenstaaende.  Maaske er det, som sagt, mig der er hjernedoed.  Men jeg haaber det vil vaere til nytte.
Avatar billede doncarnage Nybegynder
28. oktober 2010 - 03:07 #6
Woohoo.. Det lykkedes mig endelig selv nu at få det til at virke efter hensigten efter jeg fik lagt hovedet godt og grundigt i blød ;)

Jeg syntes først det virkede uoverskueligt at samle de to queries, men hvis man tog én tabel af gangen og så på hvilket udtræk jeg skulle have derfra, blev det straks en del nemmere..

Det er super fedt at du har givet dig tid til at give nogle fyldestgørende svar og det har uden tvivl været på grund af dem jeg er blevet ledt på rette vej.. Så smid et svar, så du kan få dine velfortjente points ;)

I øvrigt kom querien til at se ud som følgende, hvis du gerne vil se:

        $sql = "SELECT
        tbl_transactionsgroup.TransactionGroupID, tbl_transactionsgroup.DateDay, tbl_transactionsgroup.DateMonth, tbl_transactionsgroup.DateYear,
        tbl_transactions.TransactionGroupID, SUM(tbl_transactions.TotalPrice) AS pris, tbl_transactions.EmployeeID, tbl_transactions.CustomerID,
        tbl_customer.CustomerID, tbl_customer.Name,
        tbl_employee.EmployeeID, tbl_employee.Firstname

        FROM tbl_transactionsgroup
        INNER JOIN tbl_transactions ON tbl_transactionsgroup.TransactionGroupID = tbl_transactions.TransactionGroupID
        INNER JOIN tbl_customer ON tbl_transactions.CustomerID = tbl_customer.CustomerID
        INNER JOIN tbl_employee ON tbl_employee.employeeID = tbl_transactions.EmployeeID

        WHERE Temp = 0
        GROUP BY tbl_transactionsgroup.TransactionGroupID
        ORDER BY DateYear DESC, DateMonth DESC, DateDay DESC";
28. oktober 2010 - 05:13 #7
Jamen til lykke med det.  Og svar fra mig.
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