Autor Zpráva
ng9
Profil
Zdravím,

žádám vás o radu, už si s tím hraju nějakou hodinu a nejsem schopen vytvořit funkční řešení.

Mám tabulku se strukturou:
id       kdo                kde       typ  co           kdy         odkud  del
22521    xxx.xxx.xxx.xxx    420910    4    komentar     1334032176    0    0
22654    xxx.xxx.xxx.xxx    420910    0    komentar2    1334097795    0    1
22655    xxx.xxx.xxx.xxx    420910    4    komentar3    1334119235    0    0
22656    xxx.xxx.xxx.xxx    420910    4    komentar4    1334119265    0    0
....

kdo = ip adresa
kde = navázání na id v druhé tabulce
typ = typ komentare
co = text komentare
del = 0 = viditelný, 1 = smazaný

a potřeboval bych složit dotaz tak, aby mi vyhodil výsledky takové, že ze všech záznamů vybere řádky, které mají konkrétní hodnotu sloupku "kde" s rozdílnou ip adresou a "groupnuté" dále podle sloupku "typ" s tím, že vrátí počet řádků s počtem právě tech "typů" z různých ip adres. Zní to relativně jednoduše, ale nejsem schopen to sesmolit ....

nejblíže jsem vytvořil tento dotaz:
SELECT t.typ
    FROM tabulka t
WHERE t.kdy>".(time()-60*60*24*60)." AND t.kde={$aktualni->id} AND t.del=0
GROUP BY t.kdo

to mi vrátí pěkně "typ" každé rozdílné ip, otázka je, jak dále tento výsledek smrsknout podle daného typu a zanést počet řádků onoho smkrnutí? Aby výsledkem byl řádek s unikátními typy a jejich počtem na rozdílných ip adresách.

Podotýkám, že potřebuji vrátit počty typů na rozdílných ip, ne tedy počet na všech ip.

Mockrát děkuji jestli mi poradíte jak tento problém vyřešit. Zkoušel jsem různé variace group by, distinct ale nikdy jsem nedošel ke zdárnému výsledku.
Tori
Profil
Seskupovat se dá i podle více sloupců: GROUP BY t.kdo, t.typ. Počet řádků (v jednotlivých skupinách) se zjistí SELECT COUNT(*). Z toho byste to už měl dát dohromady.
ng9
Profil
Tori:
Díky za reakci, bohužel GROUP BY t.kdo, t.typ jsem již předtím zkoušel, ale výsledek nebyl správný a když jsem tam zakomponoval i COUNT(c.typ) do SELECTu tak mi to vrátilo právěže počet všech typů na všech ip adresách (ne rozdílných), jakoby to ukázalo počet ještě před seskupením GROUP BY a já právě potřebuji až poté ...
Kajman
Profil
ng9:
Moc jsem ten slovní popis nepobral. Co kontrétně by mělo být výsledkem hledaného dotazu? Počet jedinečných kombinací (`kdo`,`typ`) pro záznamy jednoho konkrétního `kde`?

Tedy podle příkladu jenom číslo 2?
ng9
Profil
Kajman:

Ano, jestli se dobře chápeme tak jsi to napsal správně. Jak napsala Tori, když použiji GROUP BY kdo, typ tak se zdá, že je to výsledek, který potřebuji, ale ve chvíli kdy použiji COUNT(typ) abych zjistil počty tak mi to vrátí celý počet nalezených shod a ne počet jedinečných shod až po odfiltrování různých ip adresech klauzulí GROUP BY ... doufám, že se vyjadřuji správně :).


nastíním situaci:
id       kdo        kde       typ  co           kdy         odkud  del
22521    1.2.3.4    420910    4    komentar     1334032176    0    0
22654    1.2.3.4    420910    0    komentar2    1334097795    0    1
22655    2.2.2.2    420910    4    komentar3    1334119235    0    0
22656    2.2.2.2    420910    4    komentar4    1334119265    0    0

výsledkem by mělo být, že se groupnou ip a dostanu něco jako
22521    1.2.3.4    420910    4    komentar     1334032176    0    0
22655    2.2.2.2    420910    4    komentar3    1334119235    0    0

a teď se groupne typ a vypočítá počet po předchozím groupu
[typ] = 4
[count(typ)] = 2

takto by to mělo fungovat ...
Kajman
Profil
Pokud se má vracet jedno číslo, tak žádné group by není třeba. Jen spočítáte jedinečné kombinace vybraných řádků.
SELECT COUNT(DISTINCT `kdo`, `typ`) pocet
FROM   tabulka t
WHERE  t.kde = 420910
       AND t.del = 0
ng9
Profil
Kajman:
Těch typů je samozřejmě více a může být i více výsledků ... ale takto zapsaný DISTINCT jsem nezkoušel. Zkusím a dám vědět jestli to pasuje.


Kajman:

Super Kajmane, zdá se, že to funguje jak má. Díky moc.

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: