Autor Zpráva
Peet
Profil
Dobrý den řeším problém. Snažím se udělat něco jako filtrovatelné vyhledávání uživatelů.
Příklad: tabulka users obsahuje id a nejake informace dalsi tabulka vlastnosti ta ma id,user_id,vlastnost

nyní se snažím postavit join tak že chci použít klauzuli WHERE například takto:

id,user_id,vlastnost
1, 12, admin
2, 12, kuřák
3, 12, plešatý

nyní potřebuji vytáhnout jednoho uživatele který splňuje nějaké vlastnosti:
SELECT FROM users as u LEFT JOIN vlastnosti as v ON u.id = v.user_id WHERE v.vlastnost='kuřák' AND v.vlastnost='admin';
//nekoukejte na syntaxi, programuji v oop takže jen pro pochopení

- a toto řešení by mi mělo vytáhnout user_id toho který podmínku splňuje takže zkrátka něco na způsob najdi řádek ve vlastnostech kde je vlastnost kuřák pokud ho najde tak ok a dále vlastnost admin a pokud je vše k jedomu user_id tak ho vrátí. Nevím zda jsem t zřetelně popsal.
Tori
Profil
Lepší návrh by byl:
users: id, name, login, ...
properties: id, name, ...
users_properties: id_user, id_property -- vazební tabulka, primární klíč přes oba sloupce
Tím odstraníte zbytečnou redundanci (opakování názvů vlastností).

Jinak viz FAQ
Peet
Profil
jde o to, že řeším filtrovatelné vyhledávání, tohle byl jen takový funkční příklad jinak je to takhle:
- je to v podstate tvorba dotazníků

tabulky: questions,question_types,answers,users_answers_varchar,users_answers_multi,users_answers_bool

do tabulky questions ukladam otazky ktere admini vytvori např: věk,jméno,apod.
do tabulky questions_types jsem ulozil typy otázek varchar,multi,bool
do tabulky answers ukladam volitelne odpovedi k otazkam multi pod nejake id
do tabulky users_answers_varchar ukladam question_id, user_id dotazovaneho cloveka ktery je v databazi a do sloupce answer ukladam slovni odpoved
do tabulky users_answers_multi ukladam question_id, user_id a answer_id podle toho co vybere
do tabulky users_answers_bool ukladam question_id a bud 1 nebo 0 (ano/ne)

myslíte, že je toto řešení dobré nebo by se dalo nějak vylepšit ?
Peet
Profil
Ještě jsem narazil na jeden problém.

tabulka multi:

id, question_id, user_id, answer_id
2, 46, 43 ,42
3, 46, 43, 46
4, 47, 43, 48

jak je mozné ze toto:
$query->where('(multi.question_id,multi.answer_id) in ((46,42),(47,48))->group('multi.user_id')->having('COUNT(distinct multi.answer_id) = 2');

mi vrátí true a vrátí user_id? když HAVING, tedy alespon jestli to spravne chapu, ma vratit 3 a ne 2.

protoze potrebuji udelat to ze kdyz se vyhleda mene zaznamu nez je v tabulce aby to skoncilo jako false..

a ještě jsem se chtěl zeptat k čemu tam musí ýt group ? když mi nesmyslně spojí veškeré řádky které mají stejné user_id do jednoho ikdyž mjí rozdílné answers. Rád bych tomu více porozuměl, takže kdyby mi někdo slovně vysvětlil jak přesně probíhá tato podmínka tak bych byl velice vděčný. Mockrát děkuji
Alphard
Profil
mi vrátí true a vrátí user_id?
Having nic nevrací, je to jen další filtrování. Vzhledem k uvedeným vstupním datům a where filtru (ze 3 vstupních řádků přes where projdou 2) se mi zdá v pořádku, že count v having klauzuli vrátí 2 (tj. počet záznamů) a podmínka je splněna.

k čemu tam musí ýt group ?
Group nic nespojuje, group rozděluje. Agregační funkce se pak aplikují po skupinách, nikoliv na celou sadu dat jako celek (jestli nerozumíte ani group, zkuste si jednoduchý dotaz s count(*) aplikovat na tabulku na bez/s group).

protoze potrebuji udelat to ze kdyz se vyhleda mene zaznamu nez je v tabulce aby to skoncilo jako false
Asi joinou tabulku sestavenou pomoci select count(*) from tabulka group by user_id??? a v having porovnat.
Peet
Profil
stále se mi to nedaří udělat. Ale v podstatě už tomu začínám rozumět. Ale toto řešení asi nemohu použít protože v tabulce mám např:

id, question_id, user_id, answer_id
2, 46, 43 ,42
3, 46, 43, 46
4, 47, 43, 48
5, 47, 45 ,42
6, 48, 45, 46
7, 46, 46, 48

výsledek SELECT COUNT(*) FROM .... GROUP BY user_id
je:
3,2,1
jak mám tento select zapojit do toho mého dotazu ?
$query->where('(multi.question_id,multi.answer_id) in ((46,42),(47,48))->group('multi.user_id')->having('COUNT(distinct multi.answer_id) = 2')->having('(SELECT COUNT(*) FROM c_answers_multi GROUP BY user_id)= ' . count($multi));

nefunguje
Kajman
Profil
SELECT multi.user_id,
       Count(DISTINCT multi.question_id, multi.answer_id) spravne,
       (SELECT Count(*)
        FROM   users_answers_multi m
        WHERE  m.user_id = multi.user_id)                 vsech
FROM   users_answers_multi multi
WHERE  ( multi.question_id, multi.answer_id ) IN ( ( 46, 42 ), ( 47, 48 ) )
GROUP  BY multi.user_id
HAVING spravne = 2
       AND spravne = vsech  
Peet
Profil
díky Kajmane !

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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