Autor Zpráva
mackopu
Profil
Mám tabulku s registrovanými osobami, které postupně procházejí třemi typy kurzů. Tabulka tedy obsahuje osoby, které k dnešnímu dni absolvovaly jen kurz 1, pak osoby, které absolvovaly kurz 1 a 2 (tyto osoby jsou tedy zapsány dvakrát - např. id 123, rc 000000000, jmeno Jan Novák, kurz 1 - id 245, rc 000000000, jmeno Jan Novák, kurz 2) a také osoby, které mají stejným způsobem zapsáno absolvování kuzů 1, 2 a 3.
Nyní potřebuji zjistit počet osob, které absolvovaly všechny tři kurzy.
Toto samozřejmě nefunguje a vypisuje nulu:
$dotaz = mysql_query("select id FROM registrace WHERE typ = '1' AND typ = '2' AND typ = '3'");

$soucet = mysql_num_rows($dotaz);

Nevíte někdo jak na to a přitom nepoužít cyklus?
juneau
Profil
no, ja bych mozna trochu zmenil tabulku.... kazdeho tam mel jen jednou a tri pole "kurz1, kurz2, kurz3".

ty kurzy by byly treba ENUM('0','1') a ty bys pak vybiral treba jen:

SELECT count(id) FROM registrace WHERE kurz1=1 AND kurz2=1 AND kurz3=1

to je podle me lepsi reseni. (nebo jsem nepochopil otazku)
mackopu
Profil
Tabulku měnit nelze, jsou k tomu důvody.
Boldrik
Profil
pokud nemas neco podle ceho budes unikatne identifikovat osobu (treba jemno), tak nelze.
mackopu
Profil
Mám, to je to rc - rodné číslo (v příkladu jsem vypsal nuly). Takže?
Boldrik
Profil
pockej, odzkousim si to
Boldrik
Profil
1, - jestli absolvovali postupne, nestacil by dotaz na 3 kurz?
2, - jestli absolvovali postupne, nestacil by dotaz zda prosel 3 kurzy?
mackopu
Profil
Já jsem to doposud rozchodil jen pomocí cyklu:
$dotaz=mysql_query("select distinct rc FROM registrace");

$soucet = 0;
while ($zaznam = mysql_fetch_array($dotaz)):
$rc = $zaznam["rc"];
$dotaz_a=mysql_query("select id FROM registrace WHERE rc = '$rc'");
$pocet = mysql_num_rows($dotaz_a);
if ($pocet > 2):
$soucet++;
endif;
endwhile;

Ale to je opravdu nepěkné a z nouze. Cyklu bych se nejraději vyhnul, těch záznamů je opravdu ranec.
mackopu
Profil
To je právě to, že kurzy lze absolvovat "na přeskáčku".
Boldrik
Profil
tak dvojka? muze projit jeden kurz 2x??
mackopu
Profil
Každý kurz může absolvovat jen jednou.
Boldrik
Profil
SELECT COUNT(x) AS Vysledek
FROM (SELECT COUNT(id) AS x, rc
FROM dbo.Table1
GROUP BY rc) DERIVEDTBL
WHERE (x = 3)

takhle to funguje na MS SqlServeru 2000
Boldrik
Profil
nebo jestli nezna DERIVEDTBL, tak

SELECT COUNT(x) AS Vysledek
FROM (SELECT COUNT(id) AS x, rc
FROM dbo.Table1
GROUP BY rc) as y
WHERE (y.x = 3)
Boldrik
Profil
v kazdem pripade by bylo logicke, aby klic k tabulce bylo redne cislo + typ kurzu a ne id
mackopu
Profil
Tak už to mám:
$dotaz = mysql_query("SELECT rc FROM registrace GROUP BY rc HAVING COUNT(rc)=3");

$soucet = mysql_num_rows($dotaz);

Klauzule HAVING omezuje rozsah tabulky tím, že z řádků vyřadí ty, které neodpovídají dané podmínce. V tomto případě zjišťuje 3 výskyty stejného rodného čísla, což je v daném případě relevantní, uvážíme-li, že absolventi kurzů mohou být zapsáni právě maximálně třikrát.
Za otevření očí děkuji kamarádu Zedovi a každopádně i všem účastníkům této diskuze za ochotu a tímto se o výsledek dělím s ostatními.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0