Autor | Zpráva | ||
---|---|---|---|
Hando Profil |
#1 · Zasláno: 11. 3. 2018, 16:44:22
Ahoj, vážení zkušenější kolegové. :)
Mám na vás po delší době prosbu o radu... Ono je to spíš do kategorie Databází, jak nad tím tak přemýšlím. Potřebuji docílit tohoto - vytvořím událost, která by měla být přístupná třeba pouze pro vybrané osoby, ale chci se vyhnout tomu, abych jednotlivé osoby musel vždy přidružovat k akci. Proto bych rád vytvořil systém, co podle zadaných vlastností zkontroluje, zda se člen může na danou akci přihlásit. To by neměl být problém. Váhám nad následující věcí: Pokud použiji tento systém tabulek a vazeb, jakým způsobem potom řešit výpis všech událostí, které připadají v úvahu? členové (člen_id), tagy(tag_id, tag_title), členové_tagy(člen_id, tag_id) událost(událost_id), událost_tagy (událost_id, tag_id) Příklad: Člen se může přihlásit na vybrané sportovní utkání - tím, že bude bude mít štítek s příslušným sportem ohlídám, že se bude moci přihlásit pouze na akci se stejným štítkem sportu. Dále bych rád omezil, aby se na dané utkání mohli hlásit jen osoby, které mají třeba štítek 'Tým A', ostatní ne, tím už se dotaz lehce komplikuje (můžu přidat třeba požadavek OR 'Tým B' atd.) Je nějaký rozumný způsob, jak řešit případy, kdy v jednom případě je mezi štítky vztah AND a jindy třeba OR? Je to schůdné řešení? Nedovedu si představit dotaz, který mi najde všechny akce, které tomu vyhovují a vyfiltruje akce, které ne. Máte s tímto někdo zkušenost? Díky moc za pomoc. H. |
||
Kajman Profil |
#2 · Zasláno: 11. 3. 2018, 22:54:46
Pokud si ty tagy přiřadíte do skupin vyhledávání, tak jednoduché AND a OR tím půjde - pro AND bude jiná skupina pro OR stejná.
Spočítáte kolik jedinečných skupin má událost a stejný počet by měl mít i uživatel. Tedy něco podobného jako Některé časteji řešené dotazy pro MySQL - FAQ » Nalezení položek mající všechny hledané vlastnosti jen v having bude něco jako count(distict id_skupiny)=pocethledanychskupin
|
||
Hando Profil |
#3 · Zasláno: 12. 3. 2018, 08:44:14
Díky moc, Kajmane, za reakci. Uváděný odkaz znám a s jeho nasazením víceméně počítám, spíš mi šlo o obecnější pohled, zda se dá nějak rozumně zformulovat dotaz na databázi, která by pro danou osobu našla akce, které by odpovídaly štítkům, jimiž osoba disponuje. Ale vpravdě tady tápu, jelikož si to nějak ani neumím představit, jak bych se zeptal "slovně", tak by asi vzniklý dotaz byl zbytečně komplikovaný.
Možná je jednodušší řešení načíst všechny dostupné akce s jejich kritérii a pak je v cyklu "zkontrolovat" a ponechat pouze ty dostupné. Nebo se pletu? |
||
Kajman Profil |
#4 · Zasláno: 12. 3. 2018, 09:16:11
To je fakt, ten odkaz je spíše na kontrolu jedné akce a jednoho uživatele. Pro kontrolu všech dostupných akcí pro uživatele 42 by snad šlo něco jako.
SELECT kandidati.událost_id FROM (SELECT u.událost_id, Count(DISTINCT t.tag_skupina) potrebnych_skupin FROM událost u JOIN událost_tagy ut ON u.událost_id = ut.událost_id JOIN tagy t ON ut.tag_id = t.tag_id WHERE u.událost_datum >= '2018-03-12' GROUP BY ut.událost_id) kandidati JOIN událost_tagy ut2 ON kandidati.událost_id = ut2.událost_id JOIN členové_tagy ct ON ut2.tag_id = ct.tag_id AND ct.člen_id = 42 JOIN tagy t2 ON ct.tag_id = t2.tag_id GROUP BY kandidati.událost_id, kandidati.potrebnych_skupin HAVING kandidati.potrebnych_skupin = Count(DISTINCT t2.tag_skupina) Dotaz očekává tu skupinu v tabulce tagy (případně se může dát skupina i do tabulky událost_tagy, pokud akce nebudou mít podobné seskupení pravidel u tagů). A kdyby to mělo vracet i akce, které nemají žádný tag, tak použít samé LEFT JOINy. |
||
Časová prodleva: 6 let
|
0