Получение выбора из вложенного запроса с несколькими строками
Ниже приведена таблица.
----------------------------------
| 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 ;