Autor Zpráva
Duchaplny
Profil
Zdravím,

ako sa dá spočítať, koľko riadkov so stĺpcom "pohlavie" obsahuje tabuľka podľa id ? Pod každým id môže a nemusí byť viac riadkov s pohlavím. Ja potrebujem zistiť ich počet a zapísať ich, napr. pod "id 1" sa nachádza 3xMuž, 2xŽena, pod "id 2" sa nachádza 1xMuž, 1xŽena. Pohlavie je uložené ako Muž a Žena, nie 1 a 2, preto keď použijem mysql_num_rows, tak mi to hodí:

Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home....

Nechcem meniť pohlavie na čísla, pokiaľ to nebude úplne nutné. Vie mi prosím niekto poradiť ?
PecanCZ
Profil
myslíš něco takového?
mysql_num_rows(mysql_query("SELECT * FROM tabulka WHERE id = '1' AND pohlavi = 'Muž'"));
mysql_num_rows(mysql_query("SELECT * FROM tabulka WHERE id = '1' AND pohlavi = 'Žena'"));
Duchaplny
Profil
bingo :) díky moc..
Velda
Profil
Duchaplny:
Můžu se zeptat kolik id tímto procházíš? (docela prasárna)
Tori
Profil
Duchaplny:
A nechcete to zjistit jedním dotazem a pak zpracovat v PHP?
SELECT `id`, `pohlavi`, COUNT(*) pocet FROM `tabulka` GROUP BY `id`, `pohlavi`
Výsledky vám přijdou seřazené podle id, akorát musíte u každého id ověřit, jestli byl zadaný počet mužů i žen a případně doplnit nulu (pokud pro jedno id budou jen záznamy mužů, tak počet žen se ve výsledku neobjeví vůbec).

Každopádně jestli to chcete dělat několika dotazy, tak alespoň to SELECT COUNT(*) místo SELECT * bych radila použít - takhle jen zbytečně taháte data z celé tabulky, která nepotřebujete.
Duchaplny
Profil
v podstate dosť veľké množstvo.. ak máš lepšie riešenie, tak budem vďačný za každú radu..
Velda
Profil
Duchaplny:
no v podstatě to, co Tori, jen já bych to udělal spíš takhle, aby každá lajna ve while bylo další id :)
SELECT count(CASE WHEN pohlavi='Žena' THEN 1 END) AS z, count(CASE WHEN pohlavi='Muž' THEN 1 END) AS m FROM tabulka GROUP BY id
Duchaplny
Profil
Výsledok potrebujem v číslach, napr. 1 / 1, čo by odpovedalo (1 Muž, 1 Žena).

môj zápis vyzerá teraz takto a funguje podľa predstáv:
mysql_num_rows(mysql_query("SELECT pohlavie FROM tabulka WHERE id = '1' AND pohlavie = 'Muž'"));
mysql_num_rows(mysql_query("SELECT pohlavie FROM tabulka WHERE id = '1' AND pohlavie = 'Žena'"));


tým, že mám miesto SELECT * napísané SELECT pohlavie, by sa dáta mali ťahať len zo stĺpca pohlavie.

Tori a Velda, Vaše príklady myslím riešia inú situáciu. Ja potrebujem len výsledné číslo Mužov a Žien pod určitým id.
Tori
Profil
Duchaplny:
Předpokládala jsem (shodně s Veldou), že chcete tímto způsobem zjistit počty mužů/žen postupně pro každé ID. Pokud jen pro to jedno ID, použijte třeba Veldův dotaz z [#7], jen GROUP BY id nahraďte WHERE id = 1.
To, co teď používáte (SELECT *) sice také funguje, ale je to neefektivní. Přinejmenším bych to upravila na
$kluci = mysql_result(mysql_query("SELECT COUNT(*) FROM tabulka WHERE id = 1 AND pohlavie = 'Muž'"), 0);
$holky = mysql_result(mysql_query("SELECT COUNT(*) FROM tabulka WHERE id = 1 AND pohlavie = 'Žena'"), 0);
Duchaplny
Profil
Tori:
Nie je to len pre jedno ID, to bol len príklad. Ten script mám vložený vo "while" a mám tam miesto id=1 napísané id=".$zaznam["id"].". Výslednú hodnotu počtu mužov a žien pre každé ID nepotrebujem vypisovať do riadkov, ale len celkový výsledok = jedno číslo. V tabuľke to vyzerá asi takto:

ID | Meno  |  M / Ž
1  | Peter |  3 / 2
2  | Karol |  1 / 1
3  | Jozef |  0 / 1


Váš nový príklad, vypisuje tento warning:
Warning: Division by zero in /home.....

Prial by som si ovládať MySQL trochu lepšie, aby som Vás s tým nemusel zaťažovať. Určite sa jedná o malú drobnosť, ale nemám ani tušenie, prečo je tam tá 0 na konci vo Vašom príklade.
Velda
Profil
Duchaplny:
Nejsme věštci, ta chyba je v tvojem PHP, kt. zpracovává naše SQL dotazy :) ukaž...
Jinak jestli to teda děláš, jak máš ten příklad v tabulce, tak právě proto je lepší použit jeden z těch SQL dotazů, co už jsme ti popsali :)
Duchaplny
Profil
Velda
písal som to hneď v prvom príspevku čo potrebujem :) a robím to tak ako je to v tej tabuľke. Aj tak ale neviem použiť tie Vaše príklady. S count som sa nikdy nestretol a všetko čo o PHP a MySQL viem, viem z:

http://www.linuxsoft.cz/php/
http://www.linuxsoft.cz/mysql/

moje php Vaše SQL dotazy nespracováva, ja si najskôr otestujem tie Vaše dotazy na čistej stránke a až potom ich dávam do tých ostrých, ale bohužiaľ výsledky čo som chcel, som nedokázal z tých príkladov vyťažiť, mám malý skill :)
joe
Profil
Já spíš nechápu, proč pod jedním ID máš takhle více pohlaví, jinak to co jsi potřeboval už zde bylo napsáno.
Duchaplny
Profil
joe:
tie ID sa viažu k inej tabuľke, kde tieto data sú uložené a potrebné.
V podstate som svoju odpoveď dostal hneď v druhom príspevku a všetko mi funguje ako má, takže som spokojný.
Velda
Profil
Duchaplny:
tak třeba zkopíruj část, co ti SQL vyhodí, takhle ti nemůžeme pomoct...
ale jeslti to chceš dělat, tak jak si, řekl, že ti to stačí, tak nic no... :))
Duchaplny
Profil
Velda:
ono to v podstate funguje v SQL. Problém je, že to neviem spracovať do použiteľnej formy. Tvoj príklad mi vypíše:
z | m
0 | 1
0 | 1
1 | 0
0 | 1.....
To v podstate nerieši nič. Získal som výpis všetkých tabuliek.

Mne v podstate stačí akékoľvek riešenie, ktoré funguje. Keď ale existuje možnosť urobiť to lepšie, tak to radšej urobím tak + sa niečo nové naučím.
Tori
Profil
Duchaplny:
To v podstate nerieši nič. Získal som výpis všetkých tabuliek.
Tak do toho dotazu doplňte ještě sloupce id a meno, výsledek by se pak měl podobat té tabulce v [#10].

Nie je to len pre jedno ID, to bol len príklad. Ten script mám vložený vo "while" a mám tam miesto id=1 napísané id=".$zaznam["id"].".
Nerozumím. Chcete ty hodnoty sice zjistit pro různá ID, nicméně ve while používáte ID z jiného dotazu, takže to vlastně zjišťujete x-krát pro jedno (pokaždé jiné) ID, ne?

... nemám ani tušenie, prečo je tam tá 0 na konci vo Vašom príklade.
Klikněte si na název funkce mysql_result v tom kousku kódu (podtržené názvy funkcí apod. v kódu odkazují na příslušnou stránku manuálu), mělo by to vrátit první pole (implicitně) z prvního řádku (to je ta nula) výsledku.

s count som sa nikdy nestretol
Agregační funkce COUNT(sloupec) vrací místo nalezených dat pouze počet vyhovujících řádků. Je tedy vhodnější pro případy, kdy chcete jen zjistit počet řádků výsledku. (Vizte manuál - klikněte si v kódu na název funkce.)

Ještě k tomu, co píšete v [#10]: Jak složitý je ten dotaz, jehož výsledky procházíte cyklem while? Nedalo by se dohledání počtu m/ž přidat k němu? (není to nutné, možná v konkrétní situaci ani vhodné, jen mě to teď napadlo).
Duchaplny
Profil
Tori:
Ďakujem za vysvetlenie. Ten script je čiste štatistická záležitosť pre admina. Užívatelia k tomu nemajú prístup. Nie je to kompletný script celej stránky, len ten while cyklus. Snáď to objasní problematiku, bo vo vysvetľovaní nie som moc dobrý a samozrejme postrehy uvítam.

Script:
<?
while ($zaznam=mysql_fetch_array($vysledok)):
echo "<ul>\n".
     "<li> ".$zaznam["id"]." </li>  ";
    if ($zaznam["ban"]==0) echo "<li> <span class=\"stats\"> ".$zaznam["meno"]." </span> </li>  ";
elseif ($zaznam["ban"]==1) echo "<li> <span class=\"stats\"> ".$zaznam["meno"]." - [banned] </span> </li>  ";

// vyber z tabuľky počet postáv podľa ID
$sucet=mysql_query("select * from pos where id_users=".$zaznam["id"]."", $GLOBALS["result"]);
$postavy=mysql_num_rows($sucet);

echo "<li> $postavy </li>  ";

// vyber z tabuľky pohlavie a vypíš výsledok koľko je mužov a koľko žien
$muzi=mysql_num_rows(mysql_query("select pohlavie from pos where id_users=".$zaznam["id"]." and pohlavie='Muž'"));
$zeny=mysql_num_rows(mysql_query("select pohlavie from pos where id_users=".$zaznam["id"]." and pohlavie='Žena'"));

echo "<li> $muzi / $zeny </li>  ".
     "<li> ".$zaznam["ban"]." </li>  ".
     "<li> ".$zaznam["online"]." </li>  ".
     "\n</ul>";
      endwhile;
echo "</div>";}
?>

Výsledok:
ID    Meno              Postavy    M/Ž     BAN    Online
14    Peter                2      2 / 0     0        1
40    Karol - [banned]     0      0 / 0     1        0
15    Jozef                2      1 / 1     0        1
17    Test - [banned]      0      0 / 0     1        0
13    Test2 - [banned]     0      0 / 0     1        0

Keď tak nad tým uvažujem, tak v prípade $postavy, by sa mi viac hodil Count(*) ako (SELECT *)
Tori
Profil
Tak to by šlo i jedním dotazem získávat data pro celý řádek naráz:
$sql = "SELECT `id`, `meno`, `ban`, 
    COUNT(CASE WHEN `pohlavie` = 'Muž' THEN 1 END) 'm', 
    COUNT(CASE WHEN `pohlavie` = 'Žena' THEN 1 END) 'f' 
  FROM `users` 
  LEFT JOIN `pos` ON `users`.`id` = `pos`.`id_users`
  GROUP BY `meno`";
$vysledok = mysql_query($sql);
while ($zaznam=mysql_fetch_array($vysledok)):
  echo "<ul>\n" .
    "<li> $zaznam[id]</li>" .
    "<li><span class='stats'>$zaznam[meno]" .
    ($zaznam['ban'] ? ' - [banned] ' : '') .
    "</span> </li>";
  // postavy:
  echo "<li>" . ($zaznam['m'] + $zaznam['f']) . "</li> <li>$zaznam[m] / $zaznam[f] </li>";
  echo "<li>$zaznam[ban]</li> <li>$zaznam[online]</li> \n</ul>";
endwhile;
echo "</div>";}

Předpokládám, že všechny postavy mají určené pohlaví, takže celkový počet postav mohu počítat jako součet holek+kluků. Název tabulky uživatelů jsem jen tipla.
Duchaplny
Profil
Tori:
Áno predpokladáte správne. Trochu ma zaskočil ten left join, akoby ste mi videla do databáze (skvelý tip) :) Bohužiaľ to nefunguje a vypisuje to:
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /home

Počítam, že to bude tým, že v oboch tabuľkách sa nachádzajú rovnaké stĺpce "id" a "meno".
Duchaplny
Profil
Tori:
Konečne som mal trochu času a sfunkčnil som Váš príklad. Funguje dobre až nato, že pokiaľ užívateľ nemá žiadne postavy, tak mi ho vo výsledku nenájde. Skúšal som na to prísť, ale nepodarilo sa mi to. Mohli by ste mi ešte s touto drobnosťou poradiť prosím ?
Tori
Profil
Duchaplny:
pokiaľ užívateľ nemá žiadne postavy, tak mi ho vo výsledku nenájde.
Zkoušela jsem to, a vypíše mi to normálně všechny uživatele - jen někteří mají nula postav.. tak nevím, kde je chyba. Nezaměnil jste LEFT JOIN za INNER JOIN?
Duchaplny
Profil
Tori:
heh klasika, vždy sa snažím skracovať kód čo to najviac ide a potom s tým mám len problémy :) miesto LEFT JOIN som tam dal len JOIN, s LEFT JOIN všetko funguje ako má, ďakujem.

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: