コミック サイトにタグ付けシステムを実装しようとしています。
目標はSOに似ています-ユーザーは複数のタグをクリックでき、それらのタグはそれらにとどまります-主な違いは、SOが持っているログインシステムではなく、$_SESSIONを使用してそれらを保存していることです.
ユーザーがタグをクリックすると、表示されるコミックがタグ ID に一致するものに制限されます。コミック用、タグ用、リレーショナル テーブル ComicTags の 3 つの個別のテーブルを用意するよう提案されました。コミックには 0 個または多数のタグを付けることができ、タグは 1 個または多数のコミックに関連付けることができます。
漫画IDを0または多くのタグIDに接続する正しいSQLクエリを書くのに苦労しています。
私のテーブルはこのように設定されますか?
それらを取得するためのクエリは次のようになりますか?
$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) ComicTags テーブル内の一致する ID にタグ ID を結合します。
4) この場合、WHERE タグ ID が 1 または 2 の SELECT のみを選択すると、すべてのコミック 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();
?>