将多个mysql查询组合成一个结果

Posted

技术标签:

【中文标题】将多个mysql查询组合成一个结果【英文标题】:Combining multiple mysql queries into one result 【发布时间】:2015-04-04 18:57:47 【问题描述】:

我正在使用 phpmysql 表中获取结果。我想运行多个条件语句以返回唯一结果列表。假设我有一张关于街道上房屋的表格,我的表格如下所示:

House Number | Attribute | Value
-------------------------------
23           | Colour    | White
23           | Stories   | 2
24           | Stories   | 1
25           | Colour    | Blue

注意 23 号房屋出现两次 我如何用 mysql 查询语句返回所有白色且有两层楼的房屋?在这种情况下,它只会返回一个结果 - 23。

我听到你在说什么 - 我为什么不直接将“颜色”和“故事”作为列名。嗯,原因是因为在我的示例中,房子可以有两种不同的颜色:相同属性名称的两个不同值。房子可以有两行,其中属性是颜色,值是白色,另一行是属性也是颜色,但值是紫色。只要房子有一排 colour:white 和一行 stories:2 它就会在查询中返回正数并包含在结果中

现在,一旦解决方案是运行两个不同的查询:一个查询匹配白色房屋并返回一个数组,第二个查询匹配具有两个楼层的房屋并返回一个数组,然后我可以使用 php 来比较两者数组并查看两个数组中出现的条目,将它们拉出并放入最终数组中。但这涉及调用两个 mysql 查询。有没有办法在mysql端合并查询?

【问题讨论】:

【参考方案1】:

你想要一个自加入:

SELECT
  A.`House Number` AS House
FROM
  Houses AS A
  INNER JOIN Houses AS B ON A.`House Number`=B.`House Number`
WHERE
  A.Attribute='Colour' AND A.Value='White'
  AND B.Attribute='Stories' AND B.Value='2'

【讨论】:

【参考方案2】:

试试这个

  select id from table 
    where Attribute='Colour' and Value='White' 
    and id in (select id from table where Attribute='Stories' and Value='2')

【讨论】:

虽然这个查询确实有效,但请理解,在 MySQL 的大表上使用子查询仍然会导致巨大的性能损失。这不是用户的错,而是当前 MySQL 子查询实现中的一个怪癖,很高兴知道。【参考方案3】:

您可以像这样嵌套SELECT 语句:

SELECT DISTINCT (`House_Number`) AS  `House_Number` 
FROM  `table` 
WHERE  `House_Number` 
IN (
    SELECT DISTINCT (`House_Number`) AS  `House_Number` 
    FROM  `table` 
    WHERE  `Attribute` =  'Colour'
    AND  `Value` =  'White'
)
AND  `Attribute` =  'Stories'
AND  `Value` =  '2';

编辑: 不如使用INNER JOIN 漂亮,但仍然有效。

要建立在我输入原始回复时@Eugen 发布的INNER JOIN 方法的基础上,您可以考虑包括DISTINCT,如下所示:

SELECT DISTINCT(A.`House_Number`) AS  `House_Number`
FROM `table` AS A
INNER JOIN `table` AS B ON A.`House_Number` = B.`House_Number` 
WHERE A.Attribute =  'Colour'
AND A.Value =  'White'
AND B.Attribute =  'Stories'
AND B.Value =  '2'

原因是如果要记录两次相同的属性,请这样说:

House Number | Attribute | Value
-------------------------------
23           | Colour    | White
23           | Colour    | White
23           | Stories   | 2
24           | Stories   | 1
25           | Colour    | Blue 

...那么你最终会返回两次“23”,除非你使用DISTINCT

【讨论】:

虽然这个查询确实有效,但请理解,在 MySQL 的大表上使用子查询仍然会导致巨大的性能损失。这不是用户的错,而是当前 MySQL 子查询实现中的一个怪癖,很高兴知道。 这在 OQ 中没有给出,但我假设有两个完全相同的行,例如 (23, Colour, White) 不符合应用程序的最佳利益 - 它应该被拒绝唯一的密钥或至少由应用程序提供。 同意这两点。留下子查询版本,以防它帮助那些对连接不满意的人,然后我更有可能使用较小的表。此外,虽然确保没有重复记录进入数据表当然是理想的,但会发生编码错误并且可以导入错误数据,因此我相信添加类似的小调整以防止潜在的下游问题。 您关于重复行的输入非常有用! +1 - 我会假设这被排除了,虽然它肯定不是!

以上是关于将多个mysql查询组合成一个结果的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 使用 LIMIT 有效地将两个 select 语句组合成一个结果

MySQL必知应会-第17章-组合查询

MySQL必知必会:组合查询(Union)

将多个 SQL 查询组合成单个结果

MySQL将两个查询组合成单个查询

组合查询