Autor Zpráva
JoK1955
Profil *
Zdravím všechny. Může mi, pls, někdo poradit?
Mám dvě tabulky n_tags (id, nazev) a n_foto (id,...tag,...). V první mám klíčová slova a jejich id dávám do pole tag druhé tabulky fotek. Více tagů je odděleno #. Jako příklad kopie z Adminer - sloupec nazev foto a sloupec tag
upravit    nn062001_straznik.jpg    101#115#121
upravit    nn102002_hlasna.jpg    102#115#121
upravit    nn012002_koledy.jpg    102#115#121#133
upravit    husk_hra.jpg    103#107#121

Potřebuji zjistit kolik kterých tag z n_tags je v tabulce n_foto. Zkouším
$sql = "SELECT T.nazev, T.id, COUNT(F.id) as pocet FROM n_tags T LEFT JOIN n_foto F    ON T.id = F.tag";  
$sql = "SELECT T.nazev, T.id FROM n_tags T LEFT JOIN n_foto F    ON T.id = F.tag";  
První vypiše jen jeden řádek prvni tag z n_tags a celkový počet záznamů z n_foto
Druhý dotaz vypíše všechny záznamy, ale nevím jak k tomu dostat součet tagů z n_foto. Výpis by měl vypadat takto:
NAZEVTAGU - pocet_v_n_foto
Díky za rady. JoK
Joker
Profil
JoK1955:
Viz Časté chyby v návrhu databáze: Více hodnot ve sloupci
JoK1955
Profil *
jj znám a v zásadě souhlasím... v zobrazování to mám vyřešené a připadalo mi to jednodušší než další tab. Teď bych potřeboval jen zjistit tagy, které nejsou u žádného záznamu...
Znamená to, že to SELECTem nejde?
Majkl578
Profil
JoK1955:
v zobrazování to mám vyřešené a připadalo mi to jednodušší než další tab
Což byla zásadní chyba v uvažování i v návrhu, která se ti teď vymstila. Doporučuji nastudovat principy normalizace databáze, zejména tě pak bude zajímat třetí normálová forma.

Znamená to, že to SELECTem nejde?
Nejjednodušší bude jedním dotazem je vytáhnout, v PHP rozdělit (podle #) a dalším dotazem vytáhnout tagy samotné. Z dlouhodobého hlediska by bylo nejvýhodnější opravit návrh databáze.
JoK1955
Profil *
Díky za odkaz, někdy je jednodušší nedržet se pravidel :-) Jde o jednorázovou kontrolu a vyčištění tabulky při migraci. Vyřešil jsem to cyklem a dvěma dotazy, ale myslel jsem, že by to mělo jít i jedním, na což mi - při vší úctě - nikdo neodpověděl
$sql = "SELECT nazev, id FROM n_tags ORDER BY nazev ASC";  
$result = mysql_query($sql);
while($pole = mysql_fetch_array($result)) {
  $sqli = "SELECT COUNT(*) as pocet FROM n_foto  WHERE tag REGEXP ".$pole["id"];  
  $resulti = mysql_query($sqli);
  $polei = mysql_fetch_array($resulti);    
  echo "<br>".$pole["id"].$pole["nazev"]. " - ".$polei["pocet"];
YoSarin
Profil
JoK1955:
Díky za odkaz, někdy je jednodušší nedržet se pravidel :-)
No, jak vidíš, tak není.

Vyřešil jsem to cyklem a dvěma dotazy
Řešení které tu máš dělá velice pravděpodobně daleko více dotazů než dva (počet tagů + 1 dotazů).

Správné řešení je přidat si tu jednu tabulku navíc (no tak, zas tolik práce to snad nebude).

Horší (i když taky fungující) řešení je:
SELECT count(n_photo.id), n_tags.id as tag_id, n_tags.name as tag
FROM n_tags
JOIN n_photo ON n_photo.tag REGEXP CONCAT('(^|\#)', n_tags.id, '(\#|$)')
GROUP BY n_tags.name
JoK1955
Profil *
Pravidla nechávám bez komentáře, s dotazy máš pravdu - je jich vlastně víc :-)
Ten Tvůj dotaz funguje perfektně... nad extra tabulkou se ještě zamyslím (už jsem si to probíral při návrhu, není to pro mě nic nového), zatím nejsem přesvědčen o zjednodušení stávajícího. Mám na tomto návrhu postaven celý systém zobrazování i administrace a funguje bez problémů. Teď šlo opravdu jen o mimořádnou migraci a pročištění staré tabulky...

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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