Autor Zpráva
Hando
Profil
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
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
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
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.

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: