2014-03-25 113 views
1

我有一个MySQL表与社区及其相应的MLS地图区域。有些社区很大,占用多个地图区域。MySQL子查询不返回预期结果

我试图做一个查询,返回最常见的社区和他们的地图区域时,通过多个地图区域。

我试图在地图领域的601和606的查询是:

SELECT DISTINCT(community), mapArea FROM (
    SELECT community, mapArea 
    FROM single_family 
    GROUP BY community 
    ORDER BY COUNT(community) DESC) AS query1 
WHERE mapArea LIKE '601%' OR mapArea LIKE '606%' ORDER BY community 

例single_family表布局(实际的表已超过60K行):

community mapArea 
Solera  606 - Henderson 
Solera  606 - Henderson 
Solera  204 - East 
Solera  606 - Henderson 
Solera  202 - East 
Anthem  606 - Henderson 
Green Valley 601 - Henderson 
Green Valley 601 - Henderson 
Green Valley 606 - Henderson 
Seven Hills 606 - Henderson 
Seven Hills 606 - Henderson 

如果我上运行的计数它显示的表格:

community  mapArea   countCommunity 
Anthem   606 - Henderson 776 
Solera   606 - Henderson 58 
Solera   204 - East  6 
Solera   202 - East  1 
Green Valley 601 - Henderson 188 
Green Valley 606 - Henderson 117 
Seven Hills 606 - Henderson 372 

当我运行上述查询地图区域601和606我得到以下whi CH是一些群落正确的,但索莱拉的例如社区未列出:

community  mapArea 
Anthem  606 - Henderson 
Green Valley 601 - Henderson 
Seven Hills 606 - Henderson 

由于索莱拉与地图面积为606最行 - 亨德森,我想知道什么是错在查询为何它没有被包括在内。

任何帮助,为什么这不是返回预期的结果,我必须做什么才能获得预期的结果,非常感谢。

回答

0

您正在按community分组,因此可能会在分组行中隐藏mapArea行。试试这个:

SELECT community, mapArea FROM (
    SELECT community, mapArea 
    FROM single_family 
    WHERE mapArea LIKE '601%' OR mapArea LIKE '606%' 
    GROUP BY community 
    ORDER BY COUNT(community) DESC) AS query1 
ORDER BY community 

另外,为什么使用DISTINCT时,你真的是由同一列进行分组?子查询将导致具有不同社区值的行。使用DISTINCT只会减慢过程

+0

谢谢。您的查询现在显示Solera社区,但是如果我搜索'mapArea'' 204 - East',它也会显示出来,我不想要。我遇到了这个问题,其中'community'处于不同的'mapAreas'中。由于'Solera'有'606 - Henderson'最多的行,我只希望它显示为606的搜索。 – xrjohn

+0

尝试添加HAVING mapArea LIKE'601%'或mapArea LIKE'606%'组后 – Smokie

+0

我添加了' HAVING mapArea..',它返回了与Solera在606,204和202中显示的相同结果。然后,我删除了WHERE子句,然后返回与原始查询相同的问题,Solera没有在606中显示。 – xrjohn

0

社区位于多个地图区域。你打算如何处理?

您的外部查询确实不是必需的。您可以短语查询为:

SELECT community, mapArea 
FROM single_family 
WHERE mapArea LIKE '601%' OR mapArea LIKE '606%' 
GROUP BY community 
ORDER BY community; 

如果你想列为一列所有mapArea S,使用group_concat()

SELECT community, group_concat(mapArea) as MapAreas 
FROM single_family 
WHERE mapArea LIKE '601%' OR mapArea LIKE '606%' 
GROUP BY community 
ORDER BY community; 

如果你的内容,让他们在不同的行,包括列在group by

SELECT community, mapArea 
FROM single_family 
WHERE mapArea LIKE '601%' OR mapArea LIKE '606%' 
GROUP BY community, MapArea 
ORDER BY community; 
+0

谢谢。我尝试了你发布的查询,尽管他们列出了Solera社区,但是如果我将查询更改为'mapArea' 204,就像这里的其他答案一样,它也显示出来。你的陈述是正确的,“社区在多个地图区域”。这似乎是困扰我的问题。由于Solera与'mapArea'' 606 - Henderson'的行数最多,我只希望它显示搜索606而不是204.我想知道是否需要临时表并且在其上运行第二个查询? – xrjohn

+0

@xrjohn。 。 。你的问题已经有几个答案。我认为你应该提出另一个问题,更加关心你想要产生结果的规则。 –