| Autor | Zpráva | ||
|---|---|---|---|
| Becka Profil * |
#1 · Zasláno: 21. 9. 2007, 14:10:44
Zdravím, potýkám se tu s jedním problémem a nenapadá mě, jak postupovat. Dejme tomu, že v mysql databázi je několik uživatelů, kteří mají vypsanou oblíbenou zeleninu u svého profilu. Výpis je psán jako text a každá zelenina ja na jednom řádku.
tzn: jmeno - zelenina honza - mrkev celer brambora Petr - mrkev petržel celer A já bych teď potřeboval aby u každé zeleniny bylo vypsáno například 5 druhý zeleniny, která je oblíbená uživateli,kteří rádi danou zeleninu. tzn: na nějaké kartě mrkve bude vypsáno: celer (2), brambora (1), petržel (1) Protože Honza i petr mají rádi celer, tak je u něj dvojka... Potřeboval bych to pak ještě seřadit podle oblíbenosti sestupně. Absolutně nemám žádný nápad, jak k tomuhle dojít, poradíte? |
||
| Alphard Profil |
#2 · Zasláno: 21. 9. 2007, 14:26:19
Výpis je psán jako text a každá zelenina ja na jednom řádku.
to moc nechápu :-) nejlepší by byla relace N:N (tj. 3 tabulky) 1. uživatelé, každý má jedninečné id 2. zelenina, každá má jedinečné id 3. spojovaci, 2 sloupce: id_uzivatele | id_zelenina v té by bylo např. 2 | 4 2 | 3 8 | 7 9 | 4 a z té potom: select id_zelenina, count(id_zelenina) from spojovaci group by id_zelenina order by 2 desc tento dotaz by vypsal id_zeleniny a počet, jméno zeleniny dosadíš spojením pomocí join, ale nechci to komplikovat :-) http://www.linuxsoft.cz/article.php?id_article=854 |
||
| Becka Profil * |
#3 · Zasláno: 21. 9. 2007, 14:35:22
Alphard: Špatně jsem se vyjádřil :) Ber to, jako že je tabulka uživatele, kde je: jmeno varchar(90) a zelenina text(100), pak taky nějaký id a podobně, tohle je jen pro ilustraci. Tohle zadání nelze změnit. Nemůžu tu zeleninu rozsekat do jiných tabulek.
Je jasný, že si ji vyselektuju s podmínkou WHERE zelenina LIKE '%".$zelenina."%' - což mi vybere jen uživatele, kteří rádi mrkev. Dál so rozsekám text pomocí explode na jednotlivou zeleninu u každého uživatele. Co potřebuji je nějak eliminovat zeleninu, prokterou to hledám. Dále jednotlivé pole se zeleninou sečíst podle druhu, sestupně seřadit a vypsat. Toť vše |
||
| Alphard Profil |
#4 · Zasláno: 21. 9. 2007, 15:00:36
aha, teď jsem to znovu četl, byl jsem trochu mimo, ale relace N:N by byla stejně nejlepší :-)
Tohle zadání nelze změnit. škoda :-( asi bych při zpracování dat z databáze sekal řetězec pomocí explode a kontroloval, jestli už je zelenina v poli $zelenina[] jako klíč, jestli ano, tak +1, jestli ne, vytvoříš if (array_key_exists($aktualni_zelenina, $zelenina)) $zelenina[$aktualni_zelenina]++; else $zelenina[$aktualni_zelenina] = 1; poté zničit hledanou zeleninu unset ($zelenina['mrkev']); a seřadiš arsort ($zelenina); jinak, píši to jen tak z hlavy, bude to chtít doladit a možná někoho napadne něco rychlejšího |
||
| Joker Profil |
#5 · Zasláno: 21. 9. 2007, 17:01:30
Becka
K tomu zadání jen podotknu, že jde o dost nevhodný návrh databáze. Když zadání nejde změnit, tak jen pro informaci/poučení. Problémy jsou myslím zřejmé už z toho, jak těžce se řeší jednoduchý úkol: "Najděte, uživatele, kteří mají rádi daný druh zeleniny." Ani nemluvím o tom, jak by se musel řešit další jednoduchý úkol: "Zjistěte, kolik různých druhů zeleniny mají uživatelé jako oblíbené." A asi největší legrace by bylo něco jako "Vypište pět nejoblíbenějších druhů zeleniny." Celkem názorně je vidět rozdíl mezi správným a špatným návrhem databáze. S tím uvedeným zadáním se mi u těch dvou posledních úkolů využití databáze smrskne na to, že si nechám vrátit celou tabulku a potom jí nějak skriptem zpracovávám. Zatímco se správným návrhem jde myslím oba řešit posláním jednoho SQL dotazu a zobrazením výsledku. |
||
| Becka Profil * |
#6 · Zasláno: 22. 9. 2007, 18:11:48
Joker
Nevím, jestli sis všiml, ale tady vůbec nebyla řeč o návrhu databáze. Jak můžeš tvrdit, že návrh je špatný, kdyžs jej nikdy neviděl a ani nemůžeš vědět, o co v tomhle příkladu jde. Je to naprosto vytržené z kontextu a v samotné databázi to nehraje absolutně žádnou roli. Nic jiného než tohle není a nebude potřeba. Žádný jiný dotaz či výpis se nikdy nebude provádět. Možná by bylo lepší, kdybys přispěl věcně a ne naprosto offtopic, ale i tak díky za poučení, snad se někomu bude hodit Alphard Děkuju za radu, na něco podobného jsem taky přišel, bohužel nebyl čas to doladit a dotáhnout do konce. Dnes večer na to snad najdu chvilku a uvidíme, jestli se dílo zdaří. Ještě jednou díky |
||
| tiso Profil |
#7 · Zasláno: 22. 9. 2007, 18:59:18
Becka - ťažko radiť, ked sa brániš zmene štruktúry tabuliek...
čo sa týka tvojho riešenia, tak stačí inkrementovať prvky poľa s názvom podľa obsahu premennej, potom unsetnúť prvok s hľadanou zeleninou a nakoniec to pole zoradiť... |
||
|
Časová prodleva: 19 let
|
|||
0