Получение выбора из вложенного запроса с несколькими строками

Ниже приведена таблица.

----------------------------------
| 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 | 

Я хочу, чтобы мой запрос был следующим.

"Показать названия стран, в которых площадь присутствует более одного раза между 2 указанными датами".

Я попробовал приведенный ниже запрос, но он дает мне ошибку. > #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 );

3 ответа

Чтобы сравнить значение со списком значений, необходимо использовать 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'
);

Если вы хотите страну, не выбирайте область:

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;

Вы можете искать это

    SELECT country
    FROM table1

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

    GROUP BY country
    HAVING count(date) > 1 ;

ДЕМО ЗДЕСЬ

Другие вопросы по тегам