将多个mysql查询组合成一个结果
Posted
技术标签:
【中文标题】将多个mysql查询组合成一个结果【英文标题】:Combining multiple mysql queries into one result 【发布时间】:2015-04-04 18:57:47 【问题描述】:我正在使用 php 从 mysql 表中获取结果。我想运行多个条件语句以返回唯一结果列表。假设我有一张关于街道上房屋的表格,我的表格如下所示:
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查询组合成一个结果的主要内容,如果未能解决你的问题,请参考以下文章