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

Php 将多个mysql查询组合成一个结果,php,mysql,arrays,Php,Mysql,Arrays,我正在使用php从mysql表中获取结果。我想运行多个条件语句以返回唯一结果的列表。假设我在街上有一张关于房子的桌子,我的桌子是这样的: House Number | Attribute | Value ------------------------------- 23 | Colour | White 23 | Stories | 2 24 | Stories | 1 25 | Colour

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

House Number | Attribute | Value
-------------------------------
23           | Colour    | White
23           | Stories   | 2
24           | Stories   | 1
25           | Colour    | Blue
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';
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出现了两次,我如何使用mysql查询返回所有白色且有两层楼的房屋?在这种情况下,它将只返回一个结果-23

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

现在,一个解决方案是运行两个不同的查询:一个查询匹配white House并返回一个数组,另一个查询匹配House with two stories并返回一个数组,然后我可以使用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 id from table 
    where Attribute='Colour' and Value='White' 
    and id in (select id from table where Attribute='Stories' and Value='2')

您可以嵌套
选择
语句,如下所示:

House Number | Attribute | Value
-------------------------------
23           | Colour    | White
23           | Stories   | 2
24           | Stories   | 1
25           | Colour    | Blue
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';
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 
编辑: 不像使用
内部联接那样漂亮,但仍然有效

< >在我输入我的原始响应的时候,在<代码>内部连接< /代码>方法欧根发布时,您可以考虑包括<代码>不同的< /代码>,像这样:

House Number | Attribute | Value
-------------------------------
23           | Colour    | White
23           | Stories   | 2
24           | Stories   | 1
25           | Colour    | Blue
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';
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 
原因是,如果同一属性要记录两次,可以这样说:

House Number | Attribute | Value
-------------------------------
23           | Colour    | White
23           | Stories   | 2
24           | Stories   | 1
25           | Colour    | Blue
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';
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中当前子查询实现中的一个怪癖,这一点很好。虽然此查询确实有效,但请理解,在MySQL中的大表上使用子查询仍然会导致巨大的性能损失。这不是用户的错,而是MySQL中当前子查询实现中的一个怪癖,这一点很好,OQ中没有给出,但我假设有两个完全相同的行,例如(23,颜色,白色)不符合应用程序的最佳利益-应使用唯一密钥或至少由应用程序拒绝。双方同意。保留子查询版本,以防它帮助那些还不熟悉连接的人,他们也更可能使用较小的表。此外,虽然确保数据表中没有重复记录是非常理想的,但会发生编码错误,并且会导入坏数据,因此我相信可以添加一些类似的调整,以防止潜在的下游问题。您关于重复行的输入非常有用+1-我本以为这是不可能的,但事实肯定不是这样!