mysql выбирает идентификаторы из одной таблицы, которые не найдены в другой таблице при определенных условиях

#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