我可能会以错误的方式解决这个问题,因为我找不到这样的问题。
我有一个产品表
id - name - parent
---|------|--------
1 |p-A | 0 -default
2 |p-A1 | 1 -default
3 |p-u1 | 0 -USER ADDED
我有一个将userID与PID结合的关系表(但它也有一个开/关字段)
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
所以我可以获取默认值,并且用户添加了带有类似查询的产品但很明显,AND子句什么都不做,因为我已经在第一个WHERE子句中选择了行。
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个关联。我也不想制作默认的产品表。
答案 0 :(得分: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
简化您可以使用IN语句而不是OR
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