【问题标题】:Combining multiple mysql queries into one result将多个mysql查询组合成一个结果
【发布时间】: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端合并查询?

【问题讨论】:

    标签: php mysql arrays


    【解决方案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 - 我会假设这被排除了,虽然它肯定不是!
      猜你喜欢
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多