Autor | Zpráva | ||
---|---|---|---|
JoK1955 Profil * |
#1 · Zasláno: 21. 2. 2013, 20:03:41
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"; 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 |
#2 · Zasláno: 21. 2. 2013, 20:12:10
|
||
JoK1955 Profil * |
#3 · Zasláno: 21. 2. 2013, 20:21:15
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 * |
#5 · Zasláno: 22. 2. 2013, 15:33:17
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 * |
#7 · Zasláno: 24. 2. 2013, 19:11:52
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... |
||
Časová prodleva: 11 let
|
0