#mysql #join #exists
#mysql #Присоединиться #существует
Вопрос:
Используя следующие две (упрощенные) структуры таблиц, я хотел бы найти все РАЗЛИЧНЫЕ session_id
значения, которые появляются в TABLE1
where flag = yes
, которые НЕ появляются в TABLE2
where progress = 11
.
TABLE1
не имеет повторяющихся session_id
значений.
TABLE1
id_table1 | session_id | flag
------------------------------
1 | abcd | yes
2 | efgh | no
3 | ijkl | yes
4 | mnop | yes
5 | vwxyz | yes
TABLE2
id_table2 | session_id | progress
---------------------------------
1 | abcd | 3
2 | efgh | 11
3 | ijkl | 2
4 | ijkl | 7
5 | mnop | 11
6 | vwxyz | 10
7 | vwxyz | 11
Ожидаемые результаты здесь:
abcd
ijkl
Ответ №1:
SELECT
DISTINCT t1.session_id
FROM
id_table1 t1
INNER JOIN
id_table2 t2
ON
t1.session_id = t2.session_id
WHERE
t1.flag = 'yes'
AND
t2.progress NOT IN(11)
Комментарии:
1. Это работает, но очень медленно … есть идеи о том, как это ускорить?
2. Не зная, каковы ваши индексы и что ОБЪЯСНЯЕТ выходные данные, трудно что-либо предложить. Проиндексирован ли session_id вообще?
Ответ №2:
select distinct session_id
from table1 where session_id not in (select session_id from table2) and flag='yes'
Комментарии:
1. Это также можно сделать, выполнив внутреннее объединение в поле session_id.
2. Я думаю, вы не следите за прогрессом = 11