Php 将多个mysql查询组合成一个结果
我正在使用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
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-我本以为这是不可能的,但事实肯定不是这样!