Autor Zpráva
sloncz
Profil
Dobrý den, pracuji na databázi zvířat a v databázi mám vždy druh toho zvířete ve tvaru druh="druh1, druh2", protože některá zvířata mají dva druhy a některá jen jeden.

Poté mám na webu výpis, kolik zvířat je toho a toho druhu, ovšem problém je v tom, že nevím, jak zjistit, kolik zvířat má druh="druh1".

Zkoušel jsem

$pocet_zvirat= mysql_num_rows(mysql_query("SELECT * FROM zvirata_all WHERE druh='druh1'"));

ale to nejde, protože v DB je ve sloupečku druh "druh1, druh2" a ne pouze druh1 nebo druh2.

Vůbec si envím rady a ani nevím, jestli je to takto možné. Mohl by mi prosím někdo poradit? :)
juriad
Profil
NIKDY do jednoho sloupce nezapisuj více hodnot oddělených čárkami. Databáze s takovými záznami neumí efektivně zacházet.
Můžeš zkusit dotaz:
SELECT * FROM zvirata_all WHERE druh LIKE '%druh1%'
Ale bude řádově pomalejší, než kdyby byla databáze správně navržená.
Navíc ten dotaz bude fungovat, jen když žádný druh není podslovem jiného (na dotaz ryba ti najde i velryba).
Složitější dotazy nepůjde realizovat skoro vůbec.

Spravným řešením je přidat tabulku druhy_zvirat, která bude mít dva sloupce: zvíře a druh a při dotazu provádět JOIN.
Článek k tématu: http://www.manualy.net/article.php?articleID=13; kapitola 1. normální forma
sloncz
Profil
Takže bude lepší, když si vytvořím ještě sloupek "druh1" a "druh2", vytáhnu si hodnotu z "druh", tu pomocí explode rozdělím a nechám zapsat odděleně do pole druh1 a druh2?
juriad
Profil
Ne. Vytvoříš novou tabulku, která bude přiřazovat každému zvířetí druhy. Jeden řádek = jedno přiřazení jednoho druhu jednomu zvířeti. Pro jedno zvíře tedy může existovat více řádků.

Pak dotaz bude:
SELECT * FROM zvirata_all z
JOIN zvirata_druhy zd ON z.id = zd.zvire
WHERE zd.druh = 'druh1'

Transformaci provedeš explodem v PHP a insertem záznamů do této nové tabulky.
Sloupec druh v tabulce zvirata_all úplně zrušíš.
sloncz
Profil
Dobře děkuji, Teď mi jde o to, vytáhnout náhodné zvíře z DB, ale musí se druh1 nebo druh2 rovnat "plaz".

Napadlo mě získat si pomocí mysql_num_rows počet zvířat, které mají jako druh1 nebo druh2 "plaz" ale nevím jak z nich náhodně vybrat jednoho z nich :/

Předem děkuji.
juriad
Profil
K dotazu pro vytažení všech záznamů přidej:
ORDER BY RAND()
LIMIT 1

Podmínku přeformuluješ třeba na:
WHERE zd.druh IN ('druh1', 'druh2')

Stejně jako nikdy ukládat více hodnot do jednoho sloupce, nechceš z podobných důvodů mít číslované sloupce.
Některé časteji řešené dotazy pro MySQL - FAQ » Musíte pojmenovávat sloupce s indexem (jmeno1, jmeno2, jmeno3, …)

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: