0

私は2つのテーブルを持っています。1つはアイテムです。2つ目はカテゴリ別のアイテム(catitems)です。どちらのテーブルにもユーザー フィールドがあります。

最初のテーブル (items) でユーザーごとにすべてのアイテムを選択し、特定のカテゴリに割り当てられた 2 番目のテーブル (catitem) でそれらのアイテムを除外するクエリが必要です。つまり、最初のテーブルからユーザーごとのアイテムのリストを取得しますが、2 番目のテーブルにアイテム、猫、ユーザーを含む行がある場合、そのアイテムを除外します。

概略的には、Select item FROM items where userid=1 but exclude item WHERE (in second table) (cat = "something" AND userid=1.) のようなものになります。

次のことを試しましたが、表 2 にある項目を除外していません。何が間違っていますか?

$sql = "SELECT i.*
FROM `items` i
LEFT JOIN `catitems` c
ON i.userid = c.userid
WHERE (c.userid = '$userid' && c.tcircle != '$cat')";
4

2 に答える 2

1

初め:

$sql = "SELECT i.*
FROM `items` i
LEFT JOIN `catitems` c
ON i.userid = c.userid
WHERE c.userid = '$userid'
AND c.tcircle != '$cat'";

2 番目: 。解決策:

于 2012-04-30T14:18:56.303 に答える
0

LEFT JOIN は、左側のテーブル (最初にリストされているテーブル) からのすべてと右側の必須の一致を意味します。ただし、右側のテーブルを WHERE 句に適用すると、技術的には内部結合に強制されます。そのため、ニーズを解決するには、他のテーブルに関連付けられている「条件」を対応する ON 句に移動する必要があります...

SELECT i.*
   FROM items i
           LEFT JOIN catitems c
              ON i.userid = c.userid
             AND c.tcircle != '$cat'
   WHERE 
      i.userid = '$userid'

小さいけれど微妙な違い。ユーザーに関連付けられた「ITEM」が常に必要ですが (c.userid の代わりに where i.userid を介して)、条件付きで、「$cat」ではないカテゴリのみが必要です (結合の ON 句にあります)。

于 2012-04-30T14:26:17.640 に答える