我正在尝试为我的漫画网站实施一个标记系统。
目标类似于 SO - 用户可以单击多个标签,并且这些标签与它们保持一致 - 主要区别在于我使用 $_SESSION 来存储它们,而不是 SO 拥有的登录系统。
一旦用户点击一个标签,它会将显示的漫画限制为与标签 ID 匹配的漫画。有人建议我有 3 个单独的表 - 一个用于漫画,一个用于标签,还有一个关系表 ComicTags。一个漫画可以有 0 个或多个标签,一个标签可以与 1 个或多个漫画相关联。
我正在努力编写正确的 sql 查询,将漫画 id 与 0 个或多个标签 id 连接起来。
我的桌子会这样设置吗?
我的查询会像这样吗?
$result = $mysqli->query("SELECT * FROM comics c INNER JOIN comictags ct ON (c.id = ct.comicID) WHERE ct.tagID IN (1, 2, 3) GROUP BY c.id");
谢谢!
编辑
我是否正确地想象了这一点?
1)首先从漫画和标签中选择所有列...
2) 将漫画 ID 加入到 ComicTags 表中的匹配 ID
3) 将标签 ID 加入到 ComicTags 表中的匹配 ID
4)在这种情况下,仅选择那些 WHERE 标记 id 为 1 或 2...这样将返回所有漫画 ID...
编辑 2:代码
<?php
session_start();
include 'dbconnect.php';
$site = (isset($_GET['site']) ? ($_GET['site']) : "comics");
$tag = $_GET['_tagChoice'];
if (!isset($_SESSION['tags'])) {
$_SESSION['tags'] = array();
}
$tag = $mysqli->real_escape_string($tag);
$_SESSION['tags'][] = $tag;
foreach ($_SESSION['tags'] as $tag) {
echo $tag;
}
$_SESSION['tags'] = array_unique($_SESSION['tags']);
$result = $mysqli->query(
"SELECT c.*, t.*
FROM comics c
LEFT JOIN comictags ct ON (c.id = ct.comicID)
LEFT JOIN tags t ON (t.id = ct.tagID)
WHERE ct.tagname IN (" . implode(',', $_SESSION['tags']). ")
OR ct.tagname IS NULL");
mysqli_close($mysqli);
while ($row = $result->fetch_assoc()) {
echo $row['comic_id'];
}
//session_destroy();
?>