PHP:标记系统JOIN语句

时间:2013-03-05 17:49:42

标签: php mysql

我已经在我的漫画网站上实现了一个SO风格的标记系统。

每个漫画都可以有1个或多个标签。

我目前设置的方式是:有漫画表,标签表和关系漫画表。查询将检查是否存在匹配的漫画ID和标记ID ...

$sql = 
 "SELECT c.*, t.* 
 FROM comics c 
 INNER JOIN comictags ct ON (c.id = ct.comicID)
 INNER JOIN tags t ON (t.tagid = ct.tagID)
 WHERE ct.tagID IN ('" . implode(', ', $_SESSION['tagids']). "')
". $catquery ." " . $order;

enter image description here

这个问题是每次我想在漫画ID中添加新标签时,它会强制我向comictags表添加一个新条目。

是否可以拥有更多此架构:?

comicid_1: tagid_1, tagid_2, tagid_3, etc...

意思是,我为每个漫画ID输入1个条目,并在tagid字段中为我想要关联的每个标记添加逗号分隔的标记ID。

谢谢!

2 个答案:

答案 0 :(得分:2)

你现在这样做的方式非常好。你打算做的不是。它违反了first normal form:每个属性可能只包含原子值。

当然,这是可能的。例如,通过为tagid列使用字符串类型。但这会使很多查询变得复杂,并且可能对性能不利。

答案 1 :(得分:1)

我不知道任何更简单的sql表达式:

INSERT INTO ComicsTags VALUES (1, 10), (1,20), (1,30);

对于脚本语言级别,您可以为该表编写模型的方法,这样可以更简单一些:

$comicsTags = new ComicsTags();
$tags = array(10, 20,30);
$comicsTags->add(1, $tags);