2

我正在尝试为我的漫画网站实施一个标记系统。

目标类似于 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();
?>
4

2 回答 2

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()等),因此已将其删除。如果您只想要唯一的行,请添加DISTINCTSELECT.

于 2013-02-25T14:55:10.540 回答
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

我希望这有帮助。

萨卢多斯 ;)

于 2013-02-25T15:03:54.537 回答