1

私はコミック サイトを持っており、StackOverflow のものと同様のタグ付けシステムを実装しています。

SO スタイルのタグ付けシステムを導入して、ユーザーにより多くの並べ替えオプションを提供したいと考えました。各ユーザーは、1 つまたは複数のタグを選択して削除できます...各コミック ID は、1 つまたは複数のタグに関連付けられています。

目標は次のとおりです。

  • カテゴリもタグも選択されていない場合、関数はすべてのコミックを表示します
  • カテゴリ x を選択すると、そのカテゴリのコミックのみが表示されます
  • カテゴリ x AND タグ x が選択されている場合、カテゴリ x AND タグ x のすべてのコミックが表示されます
  • カテゴリが選択されておらず、タグ x、y、z が選択されている場合、関数はそれらのタグに関連付けられたコミックのみを表示します。

リレーショナル テーブルを使用して、選択したタグ ID に一致する imgid があるかどうかを確認しています。

したがって、データベースでは、画像を複数のタグに関連付けるために (できるはずです)、同じ imgid を別のタグ ID で再度追加する必要があります。

ここに画像の説明を入力

クエリは次のとおりです。

    $sql = 
     "SELECT tbl.*, t.* 
     FROM $table tbl 
     LEFT JOIN $assocTable a ON (tbl.id = a.imgID) 
     LEFT JOIN $tagsTable t ON (t.tagid = a.tagID) 
     WHERE "; 

    $sql .= !empty($_SESSION[$sessiontagIDs]) ? "a.tagID IN (" . implode(', ', $_SESSION[$sessiontagIDs]). ") " : "1 = 1"; 
    $sql .= $catquery ." " . $order;

残念ながら、これはコミックがクエリから 2 回表示されていることを意味します。

ここに画像の説明を入力

テーブルまたはクエリの設定が間違っていませんか?

ありがとうございました!

4

1 に答える 1

3

問題は、一致するタグごとにコミックを取得していることです。おそらく、クエリで次のように取得する必要があります。

select distinct tbl.*
. . .

または、同時にタグが必要な場合は、 を使用group_concat()してリストで取得します。

select tbl.*, group_concat(t.tagname)
. . .
group by tbl.id
于 2013-03-04T00:20:15.633 に答える