Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с проверкой отношений между записями. / 6 сообщений из 6, страница 1 из 1
29.04.2016, 15:09
    #39227557
Vasiliy_Kashkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с проверкой отношений между записями.
Есть таблица, связывающая остановки и виды транспорта, останавливающегося на этих остановках:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
ID | ID_Ostanovki | ID_Transporta
---------------------------------------
1     1                   1
2     1                   2
3     2                   1
4     3                   1
5     3                   2
6     3                   3
7     4                   1
8     4                   2

Необходимо извлечь записи, соответствующие тем остановкам, на которых останавливается только транспорт с ID_Transporta=1 и ID_Transporta=2.

То есть результат запроса должен быть таким:
Код: plaintext
1.
2.
3.
4.
5.
ID | ID_Ostanovki | ID_Transporta
---------------------------------------
1     1                   1
2     1                   2
7     4                   1
8     4                   2

Как для такой задачи будет выглядеть самый эффективный запрос? Спасибо.
...
Рейтинг: 0 / 0
29.04.2016, 15:40
    #39227587
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с проверкой отношений между записями.
Vasiliy_Kashkinзаписи, соответствующие тем остановкам, на которых останавливается только транспорт с ID_Transporta=1 и ID_Transporta=2
Для таких остановок выполняются условия:
Код: sql
1.
2.
count(distinct ID_Transporta) = 2
count(case when ID_Transporta > 2 then 1 end) = 0
...
Рейтинг: 0 / 0
29.04.2016, 15:41
    #39227590
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с проверкой отношений между записями.
Даже второе лучше так:
Код: sql
1.
count(case when ID_Transporta not in (1, 2) then 1 end) = 0
...
Рейтинг: 0 / 0
29.04.2016, 17:18
    #39227713
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос с проверкой отношений между записями.
Vasiliy_KashkinКак для такой задачи будет выглядеть самый эффективный запрос?
Гуглите "реляционное деление"
...
Рейтинг: 0 / 0
30.04.2016, 10:48
    #39227961
Запрос с проверкой отношений между записями.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select
 group_concat(DISTINCT `ID` ORDER BY `ID`) AS `g_ID`,
 `ID_Ostanovki`,
 group_concat(DISTINCT `ID_Transporta` ORDER BY `ID_Transporta`) AS `g_ID_Transporta`
from `transport`
group by `ID_Ostanovki`
having `g_ID_Transporta` = "1,2"
order by `ID_Ostanovki`, `ID_Transporta`;

Код: plaintext
1.
2.
3.
g_ID	| ID_Ostanovki	| g_ID_Transporta
--------+---------------+----------------
1,2	  1		  1,2
7,8	  4		  1,2

Так пойдёт?
...
Рейтинг: 0 / 0
30.04.2016, 11:05
    #39227966
Запрос с проверкой отношений между записями.
Если нет, то вот так (но это менее эффективный вариант):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select t1.* from `transport` t1 left join
(
  select `ID_Ostanovki`,
    group_concat(DISTINCT `ID_Transporta` ORDER BY `ID_Transporta`) AS `g_ID_Transporta`
  from `transport`
  group by `ID_Ostanovki`
  having `g_ID_Transporta` = "1,2"
  order by `ID_Ostanovki`, `ID_Transporta`
) t2 USING (`ID_Ostanovki`)
where t2.`ID_Ostanovki` is not NULL;
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Запрос с проверкой отношений между записями. / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]