Autor Zpráva
luihui
Profil
Zdravím.
Jakým způsobem vytvořit toto:
Mám v mysql registrovaného uživatele, který zvolil , že je z určitého kraje. Například kraje značeného jako 2.
Potřebuji mu zobrazit příspěvky z mysql , kde v kolonce kraje je uloženo , pro které kraje je možné tento příspěvek zobrazit.
Na tom by nic nebylo. problém je v tom, že příspěvky mohou mít více možností, mohou se zobrazovat více krajům.

Zatím to mám takto:
Uživatel má například kraj 2.
Příspěvek se může zobrazovat pro kraj 2,3,4, (takto to mám uložené v mysql).

Jakým způsobem rozlišit jestli je v tomto řetězci dvojka? Nebo existuje lepší řešení jakým způsobem toto zrealizovat, než ukládat kraj příspěvku do řetězce?
juriad
Profil
Je to špatně. Mnohem lepší je toto schéma s další tabulkou, která reprezentuje vazbu mezi příspěvky a kraji.

uživatel(id, jméno, id_kraje)
kraj(id, název)
příspěvek(id, obsah)
příspěvek_v_kraji(id_prispevku, id_kraje)

(1, Franta, 2), ...
(1, Praha), (2, Středočeský), ...
(1, V Praze je blaze), (2, V Čechách řádí korupce), ...
(1, 1), (2, 1), (2, 2), ...

# příspěvky pro kraj s id=2
SELECT p.* FROM prispevky p JOIN prispevek_v_kraji pk ON p.id = pk.id_prispevku WHERE pk.id_kraje = 2

# příspěvky pro uživatele s id=1
SELECT p.* FROM prispevky p JOIN prispevek_v_kraji pk ON p.id = pk.id_prispevku JOIN uzivatel u ON u.id_kraje = pk.id_kraje WHERE u.id = 1
luihui
Profil
Děkuji.
A co když k tomu potřebuji vytvořit podmínku pro to, abych ještě vyselektoval podle věku, zda se daný příspěvek může zobrazit danému uživateli.

Příspěvek (kraj =2 , rozmezí věku 19 - 50)
Uživatel ( id, kraj, jméno, věk=19)

Potřebuji ještě k tomu vytvořit podmínku, aby se příspěvek zobrazil jen tehdy, pokud věk uživatele je v rozmezí ,které je uložené v příspěvku.
Kajman
Profil
Rozmezí si uložte do dvou sloupců, pak stačí jednoduchá podmínka
(u.vek>=p.vek_od AND u.vek<=p.vek_do)
luihui
Profil
Děkuji
luihui
Profil
Zjišťuji, že tu mám další zádrhel. Mohl bych poprosit o celý kód tohoto problému (opakuji předešlou konverzaci a přidávám další podmínky)?
Jedná se tedy o server, kde bude uživatel postupně prohlížet příspěvky a tam kde skončí , je potřeba při příští návštěvě navázat.

Mám tedy Uživatele,který při registraci vyplní údaje:
Uživatel (id, jméno, kraj, věk, pohlaví ,konec (tzn. id příspěvku na kterém přestal prohlížet).
Příspěvek (id, obsah,pohlaví ( je na výběr muž = muz, žena =zena , nebo oboje =oba, je potřeba také vytvořit podmínku, aby se zobrazovaly příspěvky jen ženám , když bude pohlaví zena, mužům, když bude pohlaví muz a nebo obou pohlavím když bude pohlaví oba), věk(rozmezí , pro jakou věkovou kategorii se může příspěvek zobrazit ,např 19-50))

kraj (pro které uživatele se příspěvek zobrazí, je tu tedy více možností :
při vytváření příspěvku to mám takto:
Celá ČR

Jihočeský
Jihomoravský
.
.
.

Takže když bude vyplněno pro "celou ČR" je kraj 1, když pro "Jihočeský" ,tak 2 a tak dále)
Potřebuji, když bude jedna aby se zobrazil pro všechny uživatele, přijde mi zbytečný a prostorově nákladný , vypisovat do druhé tabulky příspěvek_v_kraji (viz. předchozí konverzace) všech 14 možností.)

Zkusím to celé ještě popsat jednodušeji pro lepší pochopení:

Registrace uživatele:
Jméno
Kraj - 14 možností (value od 2 do 14)
pohlaví (muž =muz , žena =zena)
vek

Příspěvek
Obsah
Kraj pro který se má příspěvek zobrazit ( 15 možností , první je pro celou ČR (value =1) a poté od 2 do 14 jsou všechny kraje)
Pohlaví( Zobrazit buď pro ženy value=zena, muže value=muz , nebo obě pohlaví value=oba)
věk (Zobrazit příspěvek od do . například od 19 do 50 let)

Potřebuji podmínku na zobrazení příspěvků uživatelům , s podmínkou, že tam kde uživatel skončil , při další návštěvě bude pokračovat.
juriad
Profil
Pokud máš omezený počet možností (jako je tady u těch krajů = 14, nebo pohlaví = 2), můžeš kódovat dostupnost článku v krajích bitovou maskou.
1=Praha
2=Středočeský
4=Ústecký
8=Plzeňský
16=Liberecký
... prostě druhé mocniny

A k příspěvku dostupném v krajích Praha a Liberecký bude ve sloupci kraje součet krajů (tedy v tomto případě 1 + 16 = 17)
Stejným způsobem může uživatel říct o které kraje má zájem. Třeba 7 = Praha + Středočeský + Ústecký; celá ČR by měla hodnotu 2^14-1

Podmínka pak bude vypadat:
SELECT * FROM prispevky p JOIN uzivatele u ON p.kraje & u.kraje > 0

Výpis krajů ve kterých je příspěvek dostupný:
SELECT * FROM kraje k JOIN prispevky p ON k.id & p.kraje > 0 WHERE p.id = 123 

Pozor na to, že tímto schématem si můžeš dost zavařit život, rozhodně si vše promysli. Některé dotazy se ti hodně zkomplikují, možná i znemožní. Byl jsi varován.
Kajman
Profil
juriad:

Na takové dotazy nelze použít index a budou pomalé. Na větší projekty to je tedy nepoužitelné.
luihui
Profil
jake reseni by bylo tedy nejlepsi ?
luihui
Profil
Pomohl by nekdo prosim?
Kajman
Profil
luihui:

Tak ukaže, co teď už máte sestavé a popište, co ještě zlobí. Asi by to bylo něco jako

SELECT p.*
FROM   prispevky p
       JOIN uzivatel u
         ON p.id_kraje IN ( 1, u.id_kraje )
            AND p.pohlavi IN ( 'oba', u.pohlavi )
            AND u.vek >= p.vek_od
            AND u.vek <= p.vek_do
            AND u.konec < p.id
WHERE  u.id = 42
ORDER  BY p.id 
luihui
Profil
Popsal by jste prosím funkci tohoto kódu? nejsem si jistý , zda chápu vše.Hlavně v závorkách. Začíná to tedy

SELECT p.* FROM prispevky p JOIN uzivatel u ...

vyberu p. všechno z příspěvky p připojím uzivatel u ... atd.
Kajman
Profil
luihui:
Hlavně v závorkách

p.id_kraje IN ( 1, u.id_kraje )
je to stejné jako
( p.id_kraje = 1 OR p.id_kraje = u.id_kraje )

Přečtěte si např.
http://www.linuxsoft.cz/article.php?id_article=818
+ následujích 5 dílů toho seriálu, v tom dotaze jsou použité jen základy, které tam jsou popsané a je zbytečné je psát znovu.
luihui
Profil
Děkuji.
Jakým způsobem lze vytvořit dotaz na tabulku.
Mám tabulku prispevky kde je
id, obsah, porad (zde je a,b,c,d..)

Já potřebuji vytvořit dotaz,který v řádku porad ,kde je řetězec (a,b,c,d,e,f...) našel například c a vyhodnotil jako pravdu.

$dotaz = mysql_query("SELECT * FROM prispevky WHERE kraj LIKE 'c'; ");

Jak toto upravit , abych získal to co požaduji?
Kajman
Profil
viz. [#2] a faq
luihui
Profil
To platí i pro řetězec odlišných hodnot?
Měl bych například řetězec: a,b,c,d,e,f Zde se ani jedno písmeno neopakuje. Tudíž by podle mého laického názoru nemusel být problém. Nebo se vyskytuje problém v něčem jiném a to v hledání v řetězci?
luihui
Profil
A jak do tohoto kódu přidat ještě jednu tabulku:
SELECT p.*
FROM prispevky p
JOIN uzivatel u
ON p.id_kraje IN ( 1, u.id_kraje )
AND p.pohlavi IN ( 'oba', u.pohlavi )
AND u.vek >= p.vek_od
AND u.vek <= p.vek_do
AND u.konec < p.id
WHERE u.id = 42
ORDER BY p.id

Potřebuji přidat ještě jednu tabulku (příspěvek_v_kraji), kde se nacházejí kraje [viz #2] a podle toho i podmínka.

příspěvek(id, obsah)
příspěvek_v_kraji(id_prispevku, id_kraje)

(1, V Praze je blaze), (2, V Čechách řádí korupce), ...
(1, 1), (2, 1), (2, 2), ...

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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