Autor Zpráva
ludvalb
Profil
Zdravím, potřeboval bych poradit. Mám následující kod a potřeboval bych aby řazení probíhalo ze součtu obou tabulek. Nyní mi to řadí jen podle sum z jedné tabulky. Vím, že takto jak to mám zapsané je to myšleknově špatně, ale bohužel se mi nepodařilo přijít na to jak to zapsat správně.

$str=$_GET["str"];
if($str==""){
$limit="0,50";
}else{
$limit=$str;
}

echo '<P>';
echo '<table style="border: solid 1px; width:700px">';
echo '<tr><th>nazev</th><th>kusu</th></tr>';

$query = mysql_query('SELECT produktID, sum(ks_prodej) as ks from deni_prehled UNION ALL SELECT produktID, sum(ks_prodej) as ks from zaloha_deni_prehled WHERE autoID<0  AND date!="0000-00-00" GROUP BY produktID ORDER BY ks DESC LIMIT '.$limit); 
for ($i = 1;$i<  mysql_num_rows($query);$i++) {
  $produktID = mysql_result($query,$i,'produktID');
  $sql = MySQL_Query("SELECT sum(ks_prodej) as ks FROM deni_prehled WHERE produktID=".$produktID." AND autoID<0");
  $sql1 = MySQL_Query("SELECT sum(ks_prodej) as ks FROM zaloha_deni_prehled WHERE produktID=".$produktID." AND autoID<0");
  $sql2 = MySQL_Query("SELECT nazev FROM prodej WHERE autoID=".$produktID); 
  $sql3 = MySQL_Query("SELECT ks, produktID FROM koupeno_bez_dokladu WHERE produktID=".$produktID);
    for ($a = 0;$a<  mysql_num_rows($sql);$a++) {
      $ks_prodej += mysql_result($sql,$a,'ks');
    }
    for ($a = 0;$a<  mysql_num_rows($sql);$a++) {
      $ks_prodej_zaloha += mysql_result($sql1,$a,'ks');
    }
    for ($b = 0;$a<  mysql_num_rows($sql3);$a++) {
      $ks_koupeno_bez_dokladu += mysql_result($sql3,$a,'ks');
    }
  $ks_prodano_bez_dokladu_aktualne = $ks_prodej+$ks_prodej_zaloha-$ks_koupeno_bez_dokladu;  
  $nazev = mysql_result($sql2,0,'nazev');
  echo '<tr class="radek'.($i%2).'"><td>'.$nazev.'</td><td>'.$ks_prodano_bez_dokladu_aktualne.'</td></tr>';
  $ks_prodej = 0;
  $ks_prodej_zaloha = 0;
  $ks_koupeno_bez_dokladu = 0;
} 
echo '</table>';
Tori
Profil
Řazení podle celkové sumy by mohlo vypadat rámcově takhle:
SELECT id, SUM(kusu) ks FROM 
  (SELECT id, kusu FROM tab1)
  UNION ALL
  (SELECT id, kusu FROM tab2)
GROUP BY id ORDER BY ks DESC
Pro union se ale musí nejdřív spočítat součet z všech řádků obou tabulek, pak seřadit, pak omezit. Z jedné tabulky (se sloupcem typu BIT pro platbu s/bez dokladu) by to bylo možná rychlejší.
Zkuste, jestli by bylo velmi pomalé, kdyby se to celé řešilo jedním dotazem (a jestli by vůbec takhle fungovalo):

SELECT p.nazev, (IFNULL(SUM(d.ks_prodej), 0) + IFNULL(SUM(zd.ks_prodej), 0) - IFNULL(b.ks, 0)) kusu
FROM prodej p
LEFT JOIN deni_prehled d ON d.produktID = p.autoID AND d.autoID < 0
LEFT JOIN zaloha_deni_prehled zd ON zd.produktID = p.autoID AND zd.autoID < 0
LEFT JOIN koupeno_bez_dokladu b ON b.produktID = p.autoID
GROUP BY p.autoID HAVING kusu > 0
ORDER BY kusu DESC
LIMIT 0, 50
Nepochopila jsem, ke které tabulce se vztahuje sloupec date, doplňte si kde potřeba.
ludvalb
Profil
Tak jsem zkusil přepsat ten SELECT na toto

$query = mysql_query('SELECT produktID, SUM(ks_prodej) ks, date FROM (SELECT produktID, ks_prodej FROM deni_zalohy UNION ALL SELECT produktID, ks_prodej FROM zaloha_deni_prehled) WHERE autoID<0  AND date!="0000-00-00" GROUP BY produktID ORDER BY ks DESC LIMIT '.$limit);

a spoustu jiných možností, jako jsou závorky, bez WHERE a LIMITu a stále mi to hlásí

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /mnt/data/accounts/m/mujchovatel/data/www/prodej/prodane-bez-dokladu2.php on line 24

na řádku 24 je toto

for ($i = 1;$i<  mysql_num_rows($query);$i++) {

takže by měla být chyba v tom selectu.
Tori
Profil
ludvalb:
Předpokládám, že chyba je neexistující sloupec autoID a date. Podmínku WHERE přesuňte/zkopírujte do obou vnitřních SELECTů.
ludvalb
Profil
Tak zatím jsem to nevyřešil, ale použil jsem tuto myšlenku jinde a chce to jen doplnit alias tabulky.

$query = 'SELECT * FROM ((SELECT * FROM deni_prehled) UNION ALL (SELECT * FROM zaloha_deni_prehled)) deni_prehled_virtual
          WHERE deni_prehled_virtual.autoID LIKE "'.$find.'"';

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0