无法找出联接查询

问题描述

我有一个名为产品的表和一个 product_taxonomies product_taxonomies具有product_id和taxonomy_id字段 我正在尝试获取链接了多个product_taxonomies的产品。 使用:

SELECT "products".* FROM "products" right outer join product_taxonomies on product_taxonomies.product_id = products.id WHERE "product_taxonomies"."taxonomy_id" = $1 AND "product_taxonomies"."taxonomy_id" = $2 LIMIT $3  [["taxonomy_id",39],["taxonomy_id",29],["LIMIT",10]]

我无法获得同时具有这两个tax​​onomy_id的产品。如果我在[29,39]中使用where taxonomy_id,它将返回任何包含其中任何一个的产品,而不是同时显示两者。 我尝试了所有我知道的联接。 这是在Rails中完成的,但可以使用sql答复。

解决方法

首先,我不明白您为什么使用外部联接。

第二,当您加入product_taxonomies时,您要查询taxonomy_id具有两个不同值的记录。这样的记录不存在。

我认为您想要的是两次加入product_taxonomies这样的事情:

select p.*
  from products p
       join product_taxonomies t1 
         on t1.product_id = p.id
        and t1.taxonomy_id = $1
       join product_taxonomies t2
         on t2.product_id = p.id
        and t2.taxonomy_id = $2

如果您想将其扩展为taxonomy_id值列表,请在评论中说。

,

您可以使用GROUP BY子句来获取所有需要附加多个taxonomy_id的产品

SELECT "products".id FROM "products" 
right outer join product_taxonomies 
    on product_taxonomies.product_id = products.id
WHERE
"product_taxonomies"."taxonomy_id" IN ($1,$2)
GROUP BY products.id
HAVING COUNT(DISTINCT "product_taxonomies"."taxonomy_id" )=2

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...