我正在尝试为漫画网站实施标记系统。
目标类似于SO-用户可以点击多个标签,这些标签与它们保持一致 - 主要区别在于我使用$ _SESSION存储它们,而不是SO拥有的登录系统。 / p>
用户点击代码后,会将显示的漫画限制为与代码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加入他们在漫画表中匹配的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();
?>
答案 0 :(得分:1)
您需要将通过 comicstags
表加入tags
表,以获取TagName
。所以再添加一个INNER JOIN
:
SELECT
/* Selecting all columns from comics and tags, not from comicstags */
c.*,
t.*
FROM
comics c
/* First join matches comics to comicstags */
INNER JOIN comictags ct ON (c.id = ct.comicID)
/* Second join pairs comicstags to tags */
INNER JOIN tags t ON (t.TagID = ct.TagID)
WHERE
ct.tagID IN (1, 2, 3)
/* Or those which have no tags */
OR ct.tagID IS NULL
由于您未使用聚合(GROUP BY
等),COUNT(), SUM(), MIN(), MAX()
已被删除。如果您只想要唯一的行,请将DISTINCT
添加到SELECT
。
答案 1 :(得分:1)
使用此:
select t.TagId,t.TagNamem,cs.Path from Tag t
inner join ComicTag ct
on(t.TagId =ct.TagId)
inner join Comics cs
on(ct.ComicID = cs.Comic_id)
where t.TagId = $tag_cliked
我希望这会有所帮助。
Saludos;)