Помогите преобразовать

Vivaldy

Новичок
Помогите преобразовать

Помогите, что-то с мукулом не ладиться. Есть запрос:

[sql]SELECT data_id FROM table1 WHERE id BETWEEN 2 AND 5 AND data_id NOT IN (SELECT data_id FROM table1 WHERE id NOT BETWEEN 2 AND 5)[/sql]

надо сделать так чтоб обойтись без вложенного запроса... т.е. чтоб работало под мускулом 3.23.58
 

baev

‹°°¬•
Команда форума
А подумать?

Что в итоге этот запрос выберет?
 

Vivaldy

Новичок
Суть запроса - выборка таких data_id которые есть для тех id что равны от 2 до 5 и одновременно с этим отсутствуют во всех остальных id.

пример данных:
id | data_id
--------------
1 | 4
2 | 2
3 | 3
4 | 4
5 | 6
6 | 2

результат данного запроса будут значения: 3 и 6
так как значение 4 еще присутствует в записи где id=1, а значение 2 присутствует в записи где id=6? по этому они исключаются из результата.

Смысл всего этого - это две связные таблицы. Я удаляю значения в одной из них, соответственно мне надо удалить во второй те записи которые уже нигде больше не используются.

-~{}~ 23.07.05 08:10:

проблема в, том что мне нужно это сделать одним запросом.
 

alpine

Новичок
Vivaldy
Где-то так:
[sql]
SELECT *
FROM `table` AS t
GROUP BY
t.data_id
HAVING
COUNT(t.data_id) < 2
AND
t.id BETWEEN 2 AND 5
[/sql]
но он возвращает две колонки id и data_id
 

Vivaldy

Новичок
огромное спасибо - это то что надо... !!!!

-~{}~ 23.07.05 11:44:

упс не работает...
дело в том что оно не выдает правильный результат.
а именно если для тех данных что я привел выше выполнить запрос
[sql]
SELECT *
FROM `table` AS t
GROUP BY t.data_id
HAVING COUNT( t.data_id ) < 2 AND t.id
BETWEEN 1 AND 5
[/sql]
то в результирующем на боре по прежнему будут только 3 и 6 а надо чтоб было 3, 6 и 4. Дело в том что 4 будет присутствовать дважды но в id не включенных в условие их не будет
 

alpine

Новичок
Vivaldy
Попробуй
[sql]
SELECT t2.data_id
FROM `table` AS t1
LEFT JOIN `table` AS t2 ON t1.id = t2.id AND t2.id
BETWEEN 2 AND 5
GROUP BY
t1.data_id
HAVING
SUM(IF(t2.data_id IS NULL, 1, 0)) = 0
[/sql]
 

Vivaldy

Новичок
А... ты бог...!!!!!

-~{}~ 23.07.05 13:15:

если бы я понимал как он работает.. ну да ладно ... не буду пока задаваться такими мыслями
 

chira

Новичок
вариант
Код:
SELECT DISTINCT t1.data_id
FROM t AS t1
LEFT JOIN t AS t2 ON t1.data_id = t2.data_id AND t2.id NOT BETWEEN 2 AND 5
WHERE t1.id BETWEEN 2 AND 5 AND t2.id IS NULL
 

alpine

Новичок
chira
А для чего [sql]t1.id BETWEEN 2 AND 5[/sql]?
ведь запрос
[sql]
SELECT *
FROM t AS t1
LEFT JOIN t AS t2 ON t1.data_id = t2.data_id AND t2.id NOT BETWEEN 2 AND 5
[/sql]
выводит таблицу

Код:
id 	data_id 	id 	data_id 	
1	4	1	4	
2	2	6	2	
3	3	NULL	NULL	
4	4	1	4	
5	6	NULL	NULL	
6	2	6	2
Выражение t1.id BETWEEN 2 AND 5 уберет строки где t2.id и t2.data_id NOT NULL а потом мы выберем все что NULL выражением t2.id IS NULL.

Может в итоге запрос переписать так:
[sql]
SELECT DISTINCT t1.data_id
FROM t AS t1
LEFT JOIN t AS t2 ON t1.data_id = t2.data_id AND t2.id NOT BETWEEN 2 AND 5
WHERE t2.id IS NULL
[/sql]
у?
 

chira

Новичок
alpine
для не больших объёмов данных BETWEEN в WHERE не существеннен, но если интервал BETWEEN будет вырезать ~5% от всех данных, то это может существенно ускорить выполнение запроса ...
может быть актуально для сотни тысяч и более записей
 
Сверху