Autor Zpráva
Becka
Profil *
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
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 *
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
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
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 *
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
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ť...

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:

0