2013-04-22 62 views
0

下面是给定的表。从具有多行的嵌套查询中获取选择

---------------------------------- 
| area | country | date  | 
---------------------------------- 
| a1  |  c1 | 13-01-2013 | 
---------------------------------- 
| a2  |  c2 | 06-01-2013 | 
---------------------------------- 
| a3  |  c1 | 12-01-2013 | 
---------------------------------- 
| a4  |  c2 | 10-01-2013 | 
---------------------------------- 
| a5  |  c3 | 13-01-2013 | 
---------------------------------- 
| a1  |  c1 | 13-01-2013 | 
---------------------------------- 
| a2  |  c2 | 06-01-2013 | 
---------------------------------- 
| a3  |  c1 | 12-01-2013 | 
---------------------------------- 
| a4  |  c2 | 10-01-2013 | 
---------------------------------- 
| a5  |  c3 | 13-01-2013 | 

我想让我的查询做下一步。 “

”在给定日期之间显示该地区在不止一次出现的国家/地区的名称。“

我试过下面的查询,但它给我一个错误。 > #1242 - 子查询返回多个1行

SELECT country 
FROM table 
WHERE area = (
SELECT area 
FROM table 
WHERE dateandtime > ' 13-01-2013' 
AND dateandtime < '20-01-2013' 
GROUP BY area 
HAVING count(DISTINCT date) > 1); 
+0

在您的子查询中将您的第一个“AND”更改为WHERE,并查看得到您的位置。 – 2013-04-22 20:14:44

+0

完成。但是,错误仍然保持不变。 – tony9099 2013-04-22 20:15:49

+0

这是一个快速回应。你测试过它以确保它不起作用? – 2013-04-22 20:17:22

回答

1

的值比较值的列表,你需要使用IN。我也做了一些修改来修正你的语法。

SELECT country 
FROM table 
WHERE area IN (
SELECT area 
FROM table 
WHERE dateandtime > ' 13-01-2013' 
AND dateandtime < '20-01-2013' 
GROUP BY area, country, `date` 
HAVING count(date) > 1) 
); 

相信查询也可以简化为:

SELECT country 
FROM table 
GROUP BY area, country, `date` 
HAVING count(date) > 1 
AND dateandtime BETWEEN '14-01-2013' AND '19-01-2013' 
); 
0

如果你想有一个国家,不选择区域:

SELECT DISTINCT country 
FROM (
    SELECT country 
    FROM table 
    WHERE dateandtime > ' 13-01-2013' 
    AND dateandtime < '20-01-2013' 
    GROUP BY area 
    HAVING count(DISTINCT date) > 1 
) areas; 
0

你可以找这个

SELECT country 
    FROM table1 

    WHERE date between ' 13-01-2013' AND '20-01-2013' 

    GROUP BY country 
    HAVING count(date) > 1 ; 

DEMO HERE