2016-08-16 76 views
2

我基本上希望有一个查询,我将执行一次并希望得到结果(不需要执行多个查询),并且绝对地,查询应该使用简单MySQL结构(不像BEGIN,循环,光标那样使用复杂/高级结构)。如何根据某些条款选择具有所有不同值的列

说我有两张桌子。

1st Table =  Country (id(PK), name); 
2nd Table =  Businessman (id(PK), name, city, country_id(FK)) 

喜欢选择所有国家的商人来自不同的城市。一个国家不存在两个商人,他们来自同一个城市。如果是这样,那个国家将不会被SELECT子句选中。

国家

id name 
1 India 
2 China 
3 Bahrain 
4 Finland 
5 Germany 
6 France 

商人

id name city  country_id 
1 BM1  Kolkata  1 
2 BM2  Delhi  1 
3 BM3  Mumbai  1 
4 BM4  Beijing  2 
5 BM5  Paris  6 
6 BM6  Beijing  2 
7 BM7  Forssa  4 
8 BM8  Anqing  2 
9 BM9  Berlin  5 
10 BM10 Riffa  3 
11 BM11 Nice  6 
12 BM12 Helsinki 4 
13 BM13 Bremen  5 
14 BM14 Wiesbaden 5 
15 BM15 Angers  6 
16 BM16 Sitra   3 
17 BM17 Adliya  3 
18 BM18 Caen  6 
19 BM19 Jinjiang 2 
20 BM20 Tubli  3 
21 BM21 Duisburg 5 
22 BM22 Helsinki 4 
23 BM23 Kaarina  4 
24 BM24 Bonn  5 
25 BM25 Kemi  4 

在这方面,中国和芬兰不应该上市的。 我尝试过使用count和group,但没有运气。

你能帮我建立这个查询。

+2

添加一些样品表数据(包括“重复”)和预期结果。同时向我们展示您当前的查询尝试! – jarlh

+0

您是否认为您粘贴表格数据的方式在任何地方都易于阅读或理解? –

+0

请加上你试过的号码 –

回答

2

这是,你需要的是加入商人表,计算城市和不同的城市,如果他们相等,这意味着所有的商人都来自不同的城市:

对于缩小的版本,你究竟需要:

SELECT 
    c.`id`, 
    c.`name` 
FROM `countries` c 
INNER JOIN Businessman b ON c.`id` = b.`country_id` 
GROUP BY c.`id` 
HAVING COUNT(b.`city`) = COUNT(DISTINCT b.`city`) 
+2

这是正确的答案。我在[SQL Fiddle](http://sqlfiddle.com/#!9/60226c/2)上对它进行了测试。另外,如果你只需要国家,你可以在having子句中使用'HAVING COUNT(b.city)= COUNT(DISTINCT b.city)'。 –

+2

@SergeyLobanov感谢您的评论,我确定我已经更新过我的答案,包括您的建议 –

+1

Hello George,非常感谢解决方案并解决了问题。我的逻辑完全一样,但正如我前面在某些评论中提到的,我不知道如何使用having子句比较两个计数,我放弃了。再次感谢。 –

0

您需要用嵌套的聚合:

select * 
from Country 
where id in 
(
    select country_id 
    from 
    (
     select city, country_id, 
     count(*) as cnt -- get the number of rows per country/city 
     from Businessman 
     group by city, country_id 
    ) as dt 
    group by country_id 
    having max(cnt) = 1 -- return only those countries where all counts are unique 
) 

项或比较两项罪名:

select * 
from Country 
where id in 
(
    select country_id 
    from Businessman 
    group by country_id 
    having count(*) = count(distinct city) -- number of cities is equal to umber of rows 
) 
+0

我在选择的where子句中将'country_id'固定为'id'。此外,这些查询也适用,但对我来说,乔治的查询看起来更清晰,可能会更快,但这取决于具体情况。 –

+1

@SergeyLobanov:是的,我的查询#1有点过于复杂(但可以修改为每个城市*不超过n个)。对于查询#2,性能可能取决于商人中的行数,它主要*聚合之前的聚合*与聚合之前的聚合*。我喜欢ThorstenKettner的方法*不是那些拥有多个国家* – dnoeth

+0

是的,ThorstenKettner的解决方案很好。 –

0

嗯,我认为我们应该等待为您展现自己的查询,因为一个最好的学习从错误和他们解释。但是,现在您已经得到了答案:

是的,您需要group bycount。我会按城市分组,看看我是否有重复。然后选择国家并排除具有重复城市的国家。

select * 
from country 
where id not in 
(
    select country_id 
    from businessmen 
    group by city, country_id 
    having count(*) > 1 
); 
+0

非常感谢Thorsten;是的,你说过;现在让我解释一下,我做了与上面相同的事情,但不知道如何比较两个计数。逻辑是一样的。 –

相关问题