表未加入时的SQL过滤

时间:2016-12-15 15:10:14

标签: mysql

我需要根据未加入查询的表中是否存在值来过滤查询结果。

我有一个登录表单,允​​许用户查看仅对他们可见的产品。我的数据模型是一个prod_user表,它将产品映射到用户:

id  product  user
1   1        1
2   1        3
3   1        5
4   2        1
5   2        2
6   3        2

每种产品还有其他与之相关的产品。我的prod_assoc表读作:

id  product assoc
1   5       1
2   5       2
3   5       3
4   6       1
5   6       2

我还有一个产品表,其中包含产品信息。

可以直接查询用户可以看到的产品,然后遍历结果并查询每个产品的相关产品,但是 - 如何过滤相关产品以仅返回分配给该用户的相关产品?

我使用的完整查询很长,但基本上我为像

这样的用户抓取产品
  SELECT p.*, pu.user FROM products p LEFT JOIN prod_user pu ON pu.product=p.id WHERE user = [user variable];

基本上我为每个产品构建了一系列相关产品,比如

   SELECT p.fieldsIWant, pa.otherFields FROM prod_assoc pa LEFT JOIN products p ON p.id = pa.assoc WHERE pa.product = [that product variable as I iterate]

(这会根据需要向前端发送所有产品关联。)

问题是,该用户没有过滤相关产品。例如,我想知道用户1可以看到的产品5的所有相关产品。我得到了所有相关产品(1,2和3),但实际上用户1应该只看到产品1和2.我需要根据prod_user表中的数据过滤相关产品。我该怎么做呢?我尝试以各种方式加入它,但都没有奏效。有没有办法说,给我产品5的每个关联,但只根据prod_user表给这个用户可见的那些?

编辑:这里的答案是确实加入表格,然后只使用其他AND语句进行过滤。

1 个答案:

答案 0 :(得分:1)

对您的示例使用以下查询:

(用户1可以看到的产品5的所有相关产品。我获得所有相关产品(1,2和3)但实际上用户1应该只看到产品1和2)

 SELECT pu.user, pu.product, pa.product FROM prod_user pu, prod_assoc pa
 WHERE pa.assoc = pu.product AND pa.product = 5 AND pu.user = 1;

在5和1中使用您的变量。