Autor Zpráva
halogan
Profil
Dobry den,
dlouho jsem nepracoval s SQL a ted bych potreboval takovou malou pomoc. Potrebuji vybrat data ze dvou tabulek, kde se ale bude motat i treti tabulka.

Situace je nasledujici:
articles: sloupce id, name, ...
tags: sloupce id, tag, url
tags_articles: sloupce id, article_id, tag_id

Jde mi o to, abych jednou, maximalne dvema query vybral X clanku a k nim jejich tagy. Podarilo se mi vybrat vsechny clanky a k nim tagy pres group, ale to pak nemuzu stanovit X clanku. Nejlepsi by bylo, aby byl vystup:

name | tags
nazev clanku | skupina, skupina2, skupina3
dalsi clanek | dalsi, tagy, tady


Proste takovy implode/join v SQL prikazu. Napadaji me dve reseni:

1) Vybrat vsechny tagy a tags_articles a udelat z toho takove velke pole a pak vybrat jen clanky a ke kazdemu priradit tagy.
2) To, co potrebuji :)

Jinak predkladam schema tabulek

Diky za napady.
Martin
Profil
Moc tomu nerozumím, ale zkusil bych to takhle


CREATE TABLE `articles` (
`id` tinyint(4) NOT NULL auto_increment,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE `tags` (
`id` tinyint(4) NOT NULL auto_increment,
`tag` varchar(255) NOT NULL,
`url` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE `tags_articles` (
`id` tinyint(4) NOT NULL auto_increment,
`id_articles` tinyint(4) NOT NULL,
`id_tags` tinyint(4) NOT NULL,
PRIMARY KEY (`id`)
)


SELECT *
FROM articles, tags, tags_articles
WHERE tags_articles.id_articles = articles.id
AND tags_articles.id_tags = tags.id
LIMIT 0 , 30


Kdyby to bylo, to co potřebuješ, tak tabulka tags_articles je tam zbytečně
halogan
Profil
Asi me nechapes: tags_articles je tam z duvodu toho, ze clanek muze mit vic tagu. Tvym zpusobem dostanu kazdy clanek na x radku, kde x je pocet tagu, ja potrebuji X jako 1.
Kajman_
Profil *
Od verze 4.1 lze použít GROUP_CONCAT, které může dát více hodnot po group by do jednoho stringu, ale v tomhle případě bych možná udělal opravdu zmíněný select, kdy dostaneš pro každý článek x řádků, ale v programu si zkontroluješ, zda to id stále zpracováváš nebo je jinačí. Možná to rozhodit na dva.. první jen tagy a id článku s x řádky a nascpat to třeba do pole a pak druhý na články a tam si hodnoty z toho pole vyvolat.
halogan
Profil
Kajman: Zda se mi to, nebo mi pokazde pomuzes ty? :) Diky moc, pomohlo to:

select a.id, a.name, group_concat(t.tag separator ", ") from articles a, tags t, tags_articles ta where a.id = ta.article_id and ta.tag_id = t.id group by id

Jeste si s tim pohraju a bude to idealni.
halogan
Profil
Jeste se potykam s jednim problemkem. Sice vse funguje jak ma. Potrebuji vybrat vsechny polozky s tagem treba "foo", ale kdyz dam podminku t.tag = "foo", tak mi to pak do toho group_concat zahrne jen "foo".

Snad to nejak pujde obejit. Jestli to nijak nepujde, tak si napisu trigger, ktery to bude pridavat do dalsiho sloupce a pomoci like uz to pujde.
Kajman_
Profil *
Mělo by to jít takhle nějak... from articles a, tags t, tags_articles ta, tags t2, tags_articles t2 where a.id = ta.article_id and ta.tag_id = t.id and a.id = ta2.article_id and ta2.tag_id = t2.id and t2.tag = "foo" group by id

Já myslel, že budeš vytahovat i nějaké ty odkazy a ne jen název.

Zda se mi to, nebo mi pokazde pomuzes ty?

Zdá :-)
halogan
Profil
Kajman_: Bezvadny, funguje jak ma. Uz jsi jak krtecek - vsechno vi, vsechno zna :) Nebo to byl princ Krasoň? Teď nevím.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0