我可能以错误的方式接近这个问题,但这是背景。我有一个产品表和一个产品之间的关系表 - 因此,例如,关系表可能如下所示:
ID PRODUCT 1 PRODUCT 2
1 1 2
2 1 3
3 3 4
因此,在上面的例子中,产品 ID 1 与产品 2 和 3 相关,产品 ID 2 与 1 相关,产品 ID 3 与 1 和 4 相关(因为关系可以在第 1 列或第 2 列中)
因此,我在产品页面上,想要查找与当前产品相关的产品的详细信息。我的直觉告诉我要做这样的查询:
SELECT p.* FROM products p
WHERE p.id IN (
(SELECT product_1 AS related FROM relations WHERE product_2 = :this_product)
UNION
(SELECT product_2 AS related FROM relations WHERE product_1 = :this_product)
)
但是由于 UNION,这给了我一个语法错误。
那么,我是否做错了这一切,应该采取完全不同的方法,或者我只是对我的查询做了一个小的语法嘘声?
要获取产品列表,您可以执行以下操作:
select (case when :this_product = product_1 then product_2 else product1 end)
from relations r
where :this_product in (product_1, product_2)
然后,您可以重新加入products
。
或者,使用 exists
。 它更有效:
select p.*
from products p
where exists (select 1
from relations r
where r.product_1 = :this_product and p.id = r.product_2
) or
exists (select 1
from relations r
where r.product_2 = :this_product and p.id = r.product_1
);
您需要删除联合周围使用的括号,如下所示:
SELECT p.* FROM products p
WHERE p.id IN (
(SELECT product_1 AS related FROM relations WHERE product_2 = :this_product
UNION
SELECT product_2 AS related FROM relations WHERE product_1 = :this_product)
)
在这里检查小提琴
下面是
例子,你也可以试试这个
SELECT p.*,p1.product_1
FROM products p
LEFT JOIN relations as rel
ON p.id = relational_field
WHERE p.id IN ( product_2, product_1 )