使用关系表数据构建查询,根据变量删除查询中的某些行

时间:2013-03-08 18:53:56

标签: mysql join relationship

我可能会以错误的方式解决这个问题,因为我找不到这样的问题。

我有一个产品表

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个关联。我也不想制作默认的产品表。

1 个答案:

答案 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