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 Jinak viz FAQ |
||
Peet Profil |
#3 · Zasláno: 21. 9. 2014, 22:25:12
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 |
#5 · Zasláno: 22. 9. 2014, 01:00:56
„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 |
#8 · Zasláno: 22. 9. 2014, 11:16:08
díky Kajmane !
|
||
Časová prodleva: 10 let
|
0