php - MySQL 几个内部连接与子查询

标签 php mysql join subquery

我在无需使用 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/

相关文章:

php - jQuery 自动完成标记新标签设计模式

php - 无法创建根据相关关键字搜索 1+ 个数据库的函数

mysql - Eloquent - 不同的多列,但不精确

php - MySQL 5.5 到 5.7 停止使用索引

php - 使用 XML 和 XPath 的 Symfony DomCrawler

php - 唯一数组值

php - 使用数组对 Mysql 请求进行重复数据删除

php - MySQL COUNT 与 GROUP 和 JOIN

php - 在第二个查询中使用查询结果

php - MySQL (Laravel Eloquent) - 当两列同时有两个或多个值时获取记录