Autor Zpráva
lolek6577
Profil *
Ahoj,
chtěl bych se zeptat když mám proměnou s tagama ($tags = "kultura, historie,
cs";)a nechat vypsat články který mají podobný tagy.

$tags = "kultura, historie, cs";

$query = mysql_query("SELECT * FROM clanky WHERE tags ...");
while($row = mysql_fetch_array($query)) {
}


Poradil byste mi někdo?

Děkuji mockrát
ShiraNai7
Profil
Pro jeden by to mohlo jít takto:
SELECT * FROM `clanky` WHERE `tags` LIKE '%nejakytag%'


Pro více možná regulárními výrazy. Lepší by asi bylo ukládat tagy do zvláštní tabulky a v tabulce clanky mít sloupce, ze kterých by se podle ID na dané tagy odkazovalo. Potom by to bylo jednodušší.
lolek6577
Profil *
Ok, udělam to s tim jednim tagem, mám to ted takto. Vypisuje mi to jeden článek 5 krát nevíte cos tím?



<?
$query = mysql_query("SELECT tag FROM news_tags WHERE id_news = '".$idnews."'");
while($row = mysql_fetch_array($query)) {
$queryId = mysql_query("SELECT id_news FROM news_tags WHERE tag LIKE '%$row[tag]%'");
while($rowId = mysql_fetch_array($queryId)) {
$queryNews = mysql_query("SELECT link, title FROM news WHERE id = '".$rowId["id_news"]."'");
$rowNews = mysql_fetch_array($queryNews);
?>
<div><?=$rowNews["title"];?></div>
<?
}
}
?>
ShiraNai7
Profil
V tom kódu se moc nevyznám, ale v tom dotazu, který vypisuje ty duplikátní položky, přidej za SELECT výraz DISTINCT - ten odstraní duplikáty. Pokud to dělá tedy jen ten jeden dotaz... jinak by se to muselo dělat složitě přes pole nebo spíš raději vymyslet lepší řešení :)
Joker
Profil
ShiraNai7
v tabulce clanky mít sloupce, ze kterých by se podle ID na dané tagy odkazovalo
No to zrovna ne, pokud nemůžeme předpokládat, že každému článku odpovídá právě jeden tag.

Obecně to asi bude vazba M:N (tj. jeden článek může mít více tagů a současně stejný tag může mít více článků), takže
- tabulka článků
- tabulka tagů
- vazební tabulka id článku - id tagu

edit: Případně pokud u tagu není potřeba uchovávat nic jiného než to dané slovo, šla by vyhodit tabulka tagů a udělat jenom tabulka id článku - tag.
ShiraNai7
Profil
Joker
Myslel jsem to tak, že v tabulce pro články by byly tři (více tagů by asi nebylo třeba přiřazovat) sloupce pro uložení ID tagu. Ale tvé řešení bude asi lepší.
lolek6577
Profil *
Mám to tedy udělané následně:

-tabulka článků
-tabulka tagů + id článku

Výraz DISTINCT mi nějak nefunguje :(

Tady to je popsane (doufam ze to je aspon trosinku srozumitelne)

$id = '1';

// Výběr vše tagů daných pro článek s id = '1'
$query = mysql_query("SELECT tag FROM news_tags WHERE id_news = '".$id.'");
while($row = mysql_fetch_array($query)) {
// Výběr tagu podobný tagu z článku s id='1'
$queryId = mysql_query("SELECT id_news FROM news_tags WHERE tag LIKE '%$row[tag]%'");
while($rowId = mysql_fetch_array($queryId)) {
// Výběr title z článku ktery ma stejny tag
$queryNews = mysql_query("SELECT title FROM news WHERE id = '".$rowId["id_news"]."'");
$rowNews = mysql_fetch_array($queryNews);

echo $rowNews["title"];

}
}

Furt to děla duplicity ...
Joker
Profil
ShiraNai7
Myslel jsem to tak, že v tabulce pro články by byly tři (více tagů by asi nebylo třeba přiřazovat) sloupce pro uložení ID tagu.
Já vím, ovšem to je právě to řešení, které vřele nedoporučuju.
Obecně je situace, kdy v nějaké tabulce začnete ukládat tutéž informaci do více různých sloupců, příznakem, že je něco špatně v návrhu databáze. Takové varování je, když začnete používat indexované názvy sloupců (tj. máte sloupce něco1, něco2, něco3,...)

Jinak proč to řešení nedoporučuju, to je snadné: představte si tabulku článků, kde tagy jsou uložené ve sloupcích tag1, tag2 a tag3. A úkol zní: Vyberte všechny články, které obsahují současně tagy: "jedna", "dva" a "tři".
lolek6577
Profil *
Takže shrnuto podtrženo doporčuješ, aby byla tabulka pro tagy, pro clanky a pro spojeni tagu s clanky (aby nevznikaly duplicitni udaje s tagy) ?

Vubec nevím jak bych to měl napsat (php kod) a už vubec když pridavas clanek a davas tam ty tagy tak je nejdriv asi explojdnu a potom jeste musim zjistovat jestli este neexistuje a jestli jo tak jen pridat spojitos?
Joker
Profil
lolek6577
Takže shrnuto podtrženo doporčuješ, aby byla tabulka pro tagy, pro clanky a pro spojeni tagu s clanky (aby nevznikaly duplicitni udaje s tagy) ?
To by bylo "nejčistší" řešení, nicméně pokud jde jenom o to přiřadit článku nějaké slovo (a žádná další informace tam už není, jen to slovo), šlo by si jednu tabulku ušetřit a mít jen tabulku článků a pak tabulku id článku - tag

Pokud jde o přidávání: Samozřejmě musí být jednotlivá slova (tagy) zvlášť. No a pak by to šlo i bez předchozí kontroly, prostě v tabulce tagů by byla primární klíč celá dvojice ID článku - tag a stačilo by provést:
REPLACE INTO tagy VALUES (1, 'tag1'), (1, 'tag2'), (1, 'tag3')
(vloží tři tagy k jednomu článku, pokud daná dvojice už existuje, smaže jí a vloží znovu).
Stejný výsledek by asi mělo použití INSERT IGNORE (až na to, že tam by se duplicitní řádky nevymazávaly, ale generovaly by chyby, které se následně díky IGNORE změní na varování a zpracování pokračuje dál).

Nicméně často to bývá tak, že tagy bývají napsané všechny v nějakém textovém políčku (uživatel zadá prostě třeba "jednička, dvojka, trojka" a může to políčko přepisovat jak chce), pak je asi nejjednodušší varianta všechny existující tagy k článku vymazat (DELETE FROM tagy WHERE id_clanku = $id_clanku) a pak tam vložit ty nové (asi přes to INSERT IGNORE... pro jistotu)

No a výběr tagů k článku je potom jednoduchý: SELECT GROUP_CONCAT(tag SEPARATOR ', ') FROM tagy WHERE id_clanku=$id_clanku GROUP BY id_clanku
I když ještě jednodušší by to bylo udělat současně s výběrem dalších informací o článku přes JOIN tabulky s články a tagy a GROUP BY id_clanku.
lolek6577
Profil *
Tybrdo nejak se v tom ztracim joker, hle tak kdyz to udelam pres ty tri tabulky? Jak bych to mel asi tak udelat?

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:

0