0

テーブルのタグとアイテム、およびタグをアイテムに一致させる3番目のテーブルのタグアイテムがあります。ユーザーは、タグのリストが表示されるアイテムページに移動できます。タグをクリックすると、tagitemテーブルに行が挿入され、アイテムにタグが付けられます。

ユーザーが同じタグをアイテムに2回適用するのを防ぐために、表示されるタグのリストで、アイテムにすでに適用されているタグを除外したいと思います。したがって、タグをプルするクエリには、特定のアイテムにすでに割り当てられているタグを除外する条件が含まれている必要があると思います。しかし、私はこれを行うのに問題があります。

表は次のとおりです。

タグ

id|tag

アイテム

id|item

tagitem

id|tagid|itemid

すべてのタグをプルするクエリは次のようになります。

"SELECT * FROM tags"

アイテムに一致するタグの情報を含むテーブルがtagitemであるため、それらに参加しました。問題のアイテムのtagitemテーブルにエントリがあるタグを除外する、以下の括弧で大まかに説明されている条件を含める方法を理解する必要があります。

SELECT t.*,ti.*
FROM `tags` t
LEFT JOIN `tagitem` ti
on t.id = ti.tagid
WHERE
ti.tagid NOT IN (SELECT * FROM tagitem WHERE itemid = '22')
GROUP BY t.id

これは私が得た限りです。(現在、奇妙なオペランドエラーが発生しています。)これを行う適切な方法についての提案をいただければ幸いです。ありがとう!

4

1 に答える 1

2

これを行う1つの方法は、テーブルを変更し、テーブルにCONSTRAINTを追加して、アイテムごとに一意のタグを付けることです。

ALTER TABLE tagitem ADD UNIQUE ti_idx (tagid,itemid)

しかし、クエリでそれを行うだけの場合は、以下でこれを試してください

SELECT  a.*
FROM    tags a
        LEFT JOIN 
        (
            SELECT tagid 
            FROM tagitem 
            WHERE itemid = '22'
        ) b ON a.id = b.tagid
WHERE   b.tagid IS NULL

上記のクエリから、NOT INまたはIN)を使用する場合、サブクエリは1つの列のみを返す必要があります。

....
WHERE ti.tagid NOT IN (SELECT tagid FROM tagitem WHERE itemid = '22')
于 2012-11-11T13:12:48.907 に答える