Используя следующие две (упрощенные) структуры таблиц, я хотел бы найти все значения DISTINCT session_id, которые появляются в TABLE1, где flag = yes, что НЕ появляются в TABLE2, где 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
Jon 12 Апр 2011 в 14:37

2 ответа

Лучший ответ
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
Michael J.V. 12 Апр 2011 в 14:45
Он работает, но очень медленно ... есть идеи, как его ускорить?
 – 
Jon
12 Апр 2011 в 15:45
Не зная, какие у вас индексы и что выводит EXPLAIN, сложно что-то предложить. Индексируется ли session_id вообще?
 – 
Michael J.V.
12 Апр 2011 в 15:49
select distinct session_id 
from table1 where session_id not in (select session_id from table2) and flag='yes'
0
Andrew 12 Апр 2011 в 14:41
Это также можно сделать, выполнив внутреннее соединение в поле session_id.
 – 
Andrew
12 Апр 2011 в 14:43
Я думаю, ты не следишь за прогрессом = 11
 – 
Marco
12 Апр 2011 в 14:53