0

このような質問を見つけることができなかったので、これについて間違った方法で行っている可能性があります。

私は製品テーブルを持っています

id - name - parent
---|------|--------
1  |p-A   |  0    -default
2  |p-A1  |  1    -default
3  |p-u1  |  0    -USER ADDED

userID と PID を結合する関係テーブルがあります (ただし、on/off フィールドもあります)

id - uid - pid - on(0=no, 1=yes)
---|-----|-----|----
1  | 0   | 1   | 1 - uid-0 for default association(ok?)
2  | 0   | 2   | 1
3  | 1   | 3   | 1 - USER ADDED association
4  | 1   | 2   | 0 - USER does not want this default product

したがって、デフォルトを取得でき、ユーザーはこのようなクエリで製品を追加しましたが、最初の WHERE 句で既に行を選択しているため、明らかに AND 句は何もしません。

SELECT prod.id, prod.name, prod.parent, rel.pid, rel.uid, rel.on 
FROM prod, rel 
WHERE rel.uid = 0 OR rel.uid = '$uid' 
AND rel.on <> 0

PHP関数を使用せずに、クエリで特定のユーザーに対してオフになっている製品を省略する方法を理解できないようです

注: デフォルトのユーザーごとにユーザー/製品の関連付けを作成できることはわかっていますが、すべてのユーザーにこれらの 15 の関連付けを挿入したくありませんでした。また、デフォルトの製品テーブルを作成したくありませんでした。

4

1 に答える 1

0

括弧がありません。OR を括弧で囲まないと、クエリはこれらの条件のいずれかに一致するすべてのレコードを返します。prod と rel の間の結合も欠落しているため、余分なレコードも返されます。

SELECT prod.id, prod.name, prod.parent, rel.pid, rel.uid 
FROM prod
    INNER JOIN rel ON prod.id = rel.id
WHERE (rel.uid = 0 OR rel.uid = '$uid')
AND rel.on <> 0

簡単にするために、OR ではなく IN ステートメントを使用できます。

SELECT prod.id, prod.name, prod.parent, rel.pid, rel.uid 
FROM prod
    INNER JOIN rel ON prod.id = rel.id
WHERE rel.uid IN (0,'$uid')
AND rel.on <> 0
于 2013-03-08T18:58:16.607 に答える