2

コミック サイトにタグ付けシステムを実装しようとしています。

目標は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();
?>
4

2 に答える 2

1

を取得するには、テーブルを介しcomicstagsテーブルに参加する必要があります。もう1つ追加します:tagsTagNameINNER 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 に答える