Avatar billede doncarnage Nybegynder
07. oktober 2010 - 05:47 Der er 1 kommentar og
1 løsning

Løkker i løkker - undgå duplikering?

Godaften/morgen..

Jeg bruger følgende til at udskrive en liste over transaktioner:

<?php

$querytemp1 = mysql_query("SELECT * FROM tbl_transactions WHERE tbl_transactions.CustomerID ='".$_GET['id']."' AND Temp = 1") or die(mysql_error());

while ($rowtemp1 = mysql_fetch_assoc($querytemp1)) {

  $querytemp2 = mysql_query("SELECT * FROM tbl_transactions INNER JOIN tbl_product ON tbl_transactions.ProductID = tbl_product.ProductID WHERE TransactionGroupID = '".$rowtemp1['TransactionGroupID']."' AND Temp = 1") or die(mysql_error());
  $querytemp3 = mysql_query("SELECT * FROM tbl_transactions INNER JOIN tbl_product ON tbl_transactions.ProductID = tbl_product.ProductID INNER JOIN tbl_productgroup ON tbl_product.ProductGroupID = tbl_productgroup.ProductGroupID WHERE TransactionGroupID = '".$rowtemp1['TransactionGroupID']."' AND Temp = 1") or die(mysql_error());

  while ($rowtemp2 = mysql_fetch_assoc($querytemp2) AND $rowtemp3 = mysql_fetch_assoc($querytemp3)) {

echo '<div class="t21">'.$rowtemp3['Name'].' - '.$rowtemp2['Name'].'</div>';
echo '<div class="t1">'.$rowtemp1['Price'].'</div>';
echo '<div class="t1">'.$rowtemp1['Discount'].''.$rowtemp1['DiscountType'].'</div>';
echo '<div class="t1">'.$rowtemp1['TotalPrice'].'</div>';
echo '<div class="t14">'.$rowtemp1['Amount'].'</div>';
echo '<div class="t14"><a href="faktura_tempslet.php?id='.$rowtemp1['TransactionID'].'" onClick="return window.confirm(\'Er du sikker på at du vil slette det midlertidige produkt?\');"><img src="images/delete.png" alt="slet faktura" title="slet faktura" border="0" /></a></div>';

  }
}
?>


Problemet er bare at hver transaktion bliver udskrevet 3 x pga. løkkerne ligger inde i hinanden :(

Spørgsmålet er så hvordan jeg får den til at udskrive det rigtige antal gange (dvs. 1 gang pr. transaktion), nu hvor min 2. og 3. sql query er afhængig af den første?
Avatar billede perfektus Nybegynder
07. oktober 2010 - 09:40 #1
Ved ikke om jeg har forstået spørgsmålet korrekt, men hvis du kun vil have 1 udskrivning per transaktion, og du du kun for 1 row af dine 2 sql query's.

Jamen så er det vel vare at cutte dit inner loop.

<?php

$querytemp1 = mysql_query("SELECT * FROM tbl_transactions WHERE tbl_transactions.CustomerID ='".$_GET['id']."' AND Temp = 1") or die(mysql_error());

while ($rowtemp1 = mysql_fetch_assoc($querytemp1)) {

  $querytemp2 = mysql_query("SELECT * FROM tbl_transactions INNER JOIN tbl_product ON tbl_transactions.ProductID = tbl_product.ProductID WHERE TransactionGroupID = '".$rowtemp1['TransactionGroupID']."' AND Temp = 1") or die(mysql_error());
  $querytemp3 = mysql_query("SELECT * FROM tbl_transactions INNER JOIN tbl_product ON tbl_transactions.ProductID = tbl_product.ProductID INNER JOIN tbl_productgroup ON tbl_product.ProductGroupID = tbl_productgroup.ProductGroupID WHERE TransactionGroupID = '".$rowtemp1['TransactionGroupID']."' AND Temp = 1") or die(mysql_error());
 
  $rowtemp2 = mysql_fetch_assoc($querytemp2); 
  $rowtemp3 = mysql_fetch_assoc($querytemp3);

    echo '<div class="t21">'.$rowtemp3['Name'].' - '.$rowtemp2['Name'].'</div>';
    echo '<div class="t1">'.$rowtemp1['Price'].'</div>';
    echo '<div class="t1">'.$rowtemp1['Discount'].''.$rowtemp1['DiscountType'].'</div>';
    echo '<div class="t1">'.$rowtemp1['TotalPrice'].'</div>';
    echo '<div class="t14">'.$rowtemp1['Amount'].'</div>';
    echo '<div class="t14"><a href="faktura_tempslet.php?id='.$rowtemp1['TransactionID'].'" onClick="return window.confirm(\'Er du sikker på at du vil slette det midlertidige produkt?\');"><img src="images/delete.png" alt="slet faktura" title="slet faktura" border="0" /></a></div>';

 
}
?>
Avatar billede mrgumble Nybegynder
07. oktober 2010 - 10:50 #2
Det første jeg vil henlede din opmærksomhed på er dette: http://tinyurl.com/dhxhf4

Til din SQL, så tror jeg, at den kan optimeres til en enkelt SQL-statement. Prøv dette i f.eks. phpMyAdmin og se om det giver det ønskede resultat (men husk lige at ændre ID'en):

SELECT t1.*, t2.Name as ProductName, t3.Name as GroupName
FROM tbl_transaction as t1
INNER JOIN tbl_product as t2 ON t1.ProductID = t2.ProductID
INNER JOIN tbl_productgroup as t3 ON t1.ProductGroupID = t2.ProductGroupID
WHERE t1.CustomerID = {$_GET["id"]} AND Temp=1;


Og husk lige at sætte noget index på dine tre tabeller.
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