Autor | Zpráva | ||
---|---|---|---|
luihui Profil |
#1 · Zasláno: 9. 9. 2013, 16:22:30
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 |
#3 · Zasláno: 9. 9. 2013, 20:51:15
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 |
#4 · Zasláno: 9. 9. 2013, 21:02:44
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 |
#5 · Zasláno: 9. 9. 2013, 21:06:43
Děkuji
|
||
luihui Profil |
#6 · Zasláno: 9. 9. 2013, 22:46:24
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 |
#8 · Zasláno: 10. 9. 2013, 20:19:32
juriad:
Na takové dotazy nelze použít index a budou pomalé. Na větší projekty to je tedy nepoužitelné. |
||
luihui Profil |
#9 · Zasláno: 11. 9. 2013, 07:25:42
jake reseni by bylo tedy nejlepsi ?
|
||
Časová prodleva: 3 dny
|
|||
luihui Profil |
#10 · Zasláno: 13. 9. 2013, 20:43:58
Pomohl by nekdo prosim?
|
||
Kajman Profil |
#11 · Zasláno: 13. 9. 2013, 21:02:06
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 |
#12 · Zasláno: 15. 9. 2013, 20:25:19
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 |
#13 · Zasláno: 16. 9. 2013, 13:50:48
luihui:
„Hlavně v závorkách“ p.id_kraje IN ( 1, u.id_kraje ) ( 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 |
#14 · Zasláno: 16. 9. 2013, 20:52:08
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 |
#15 · Zasláno: 16. 9. 2013, 21:02:48
|
||
luihui Profil |
#16 · Zasláno: 16. 9. 2013, 21:10:09
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 |
#17 · Zasláno: 16. 9. 2013, 22:18:20
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), ... |
||
Časová prodleva: 11 let
|
0