我在无需使用 PHP 构建查询的情况下简化复杂查询时遇到了问题。
我的问题:
一个产品可以有多个属性,例如。颜色、大小和状态。 要获得具有所有 3 个属性的产品,我可以:
products p
INNER JOIN product_propeties p1 on p.pid = p1.pid AND p1.property = 1 (color)
INNER JOIN product_propeties p2 on p.pid = p2.pid AND p2.property = 2 (size)
INNER JOIN product_propeties p3 on p.pid = p3.pid AND p3.property = 3 (state)
这很好用。我将获得具有所有这 3 个属性的所有产品。
我现在的问题是我不想用 PHP 生成 p1、p2、p3。属性列在表“property_groups”中。在此表中,我可以对属性进行分组。
proberty|title|group_name
1|color|winterspecial
2|size|winterspecial
3|state|winterspecial
我想加入带有“winterspecial”的“property_groups”表,我不知道如何加入上面的示例。问题是每个属性都需要存在。几个单一的连接完成这项工作。但是如何在单个 MySQL 查询中完成。
使用 PHP,我选择所有“winterspecial”,然后使用 p1、p2...构建查询
一定有更好的方法。请注意,属性必须是 AND connectet。 或者很容易,这将是一个简单的子选择。
INNER JOIN product_propeties p1 on p.pid = p1.pid AND product_propeties IN (
SELECT * FROM property_groups WHERE "winterspecial"
)
最佳答案
这可能看起来有点笨拙,但这是我目前唯一能想到的……
为了了解产品是否具有所有 winterspecial 属性,我们可以计算所有现有的 winterspecial 属性和产品的 winterspecial 属性,然后比较这两个数字。
然后我们可以从产品ID在搜索结果中的products和product_properties中选择:
select ...
from products p
join product_properties pp on pp.pid = p.pid and pp.property in
(select property from property_groups where group_name = 'winterspecial')
where p.pid in
(
select pid
from product_properties
where property in
(select property from property_groups where group_name = 'winterspecial')
group by pid
having count(*) =
(select count(*) from property_groups where group_name = 'winterspecial')
);
关于php - MySQL 几个内部连接与子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32989452/