0

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

我有一个产品表

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

我有一个将用户 ID 与 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 个关联。我也不想制作默认产品表。

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

为简化起见,您可以使用 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
于 2013-03-08T18:58:16.607 回答