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


Combining multiple mysql queries into one result

我使用php从mysql表中获取结果。我想运行多个条件语句来返回一个唯一结果列表。假设我有一张关于我所在街道上房屋的桌子,我的桌子看起来是这样的:

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

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

我听到你在说什么了——为什么我不把"颜色"answers"故事"作为列名呢。原因是在我的例子中,一栋房子可以有两种不同的颜色:同一个属性名称有两个不同的值。一栋房子可以有两排,一排属性是颜色,值是白色,另一排属性也是颜色,但值是紫色。只要房子有一排颜色:白色和一排故事:2,它就会在查询中返回正数,并包含在结果中

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

您想要一个自加入:

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'

您可以嵌套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

试试这个

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