我正在使用php从mysql表中获取结果。我想运行多个条件语句来返回唯一结果列表。假设我在街上有一张关于房屋的桌子,我的桌子看起来像这样:
House Number | Attribute | Value
-------------------------------
23 | Colour | White
23 | Stories | 2
24 | Stories | 1
25 | Colour | Blue
注意门牌号码23出现两次我怎么说一个mysql查询返回所有白色且有两个故事的房子?在这种情况下,它只返回一个结果--23。
我听到你在说什么 - 为什么我不把列名作为'颜色'和'故事'。好吧,原因是因为在我的例子中,房子可以有两种不同的颜色:同一属性名称的两个不同的值。房子可以有两行,一个属性是颜色,值是白色,另一个属性也是颜色,但值是紫色。只要房子有一排颜色:白色和一排有故事:2它将在查询中返回正数并包含在结果中
现在,一旦解决方案将运行两个不同的查询:一个查询匹配白宫并返回一个数组,第二个查询匹配带有两个故事的房子并返回一个数组,然后我可以使用PHP来比较两个数组并查看两个数组中出现的条目,将它们拉出并将它们放入最终数组中。但这涉及调用两个mysql查询。有没有办法在mysql端组合查询?
答案 0 :(得分:4)
你想要一个自我加入:
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'
答案 1 :(得分: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
那么漂亮,但仍然有效。
要在我输入原始回复时发布INNER JOIN
方法@Eugen,您可以考虑加入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
...那么你最终会和#34; 23"除非您使用DISTINCT
答案 2 :(得分:1)
试试这个
select id from table
where Attribute='Colour' and Value='White'
and id in (select id from table where Attribute='Stories' and Value='2')