Помогите составить запрос (+)

Bor-ka

Новичок
Помогите составить запрос (+)

Помогите составить оптимальный запрос.

Имеются две таблицы:
Таблица 1

ID | Поле 1
1 | Текст 1
2 | Текст 2
3 | Текст 3

Таблица 2
ID | Поле 1 | Поле 2
1 | 1 | 1
2 | 2 | 1
3 | 2 | 3
4 | 3 | 3
5 | 3 | 1

"Поле 1" в "таблице 2" - ID записи из "таблицы 1"

Необходимо:
выбрать из таблицы 1 все записи, для которых в "таблице 2" есть ВСЕ идентификаторы в Поле 2 из заранее определенного множества, например [1,3], т.е. к таким подходит "Текст 2" и "Текст 3".

Решили сделать в два запроса:
1. Выбрать из второй таблице все, у кого есть хоть одно вхождение идентификатора из множества -> выносим во временную таблицу
2. Во временной таблице группировка с подсчетом количества встречаемых, если count равно колчиеству элементов множества, то подходит.

вижу, что через ж*пу, но иначе никак не можем придумать.

[пример иcправлен]
 

alpine

Новичок
Bor-ka
Необходимо:
выбрать из таблицы 1 все записи, для которых в таблице два есть ВСЕ идентификаторы в Поле 2 из заранее определенного множества, например [1,2], т.е. к таким подходит "Текст 2" и "Текст 3".
Ты ничего не напутал с примером? Может {1,3} и "Текст 1" и "Текст 3"?
 

alpine

Новичок
Bor-ka
Структура тестовых таблиц:
SHOW COLUMNS FROM t1:
id int(10) unsigned PRI NULL auto_increment
text varchar(255)

SHOW COLUMNS FROM t2:
t1_id int(10)
item int(10)

Для решения твоей задачи можно использовать два запроса:

1-й:
[sql]
SELECT DISTINCT t1.*
FROM `t1`
INNER JOIN t2 AS t2_1 ON t1.id = t2_1.t1_id AND t2_1.item =1
INNER JOIN t2 AS t2_2 ON t2_1.t1_id = t2_2.t1_id AND t2_2.item =3
[/sql]
2-й:
[sql]
SELECT t1. *
FROM `t1` , t2
WHERE t1.id = t2.t1_id AND (
t2.item =1 OR t2.item =3
)
GROUP BY t1.id
HAVING COUNT( DISTINCT t2.item ) =2
[/sql]

Недавно это обсуждалось здесь:
http://phpclub.ru/talk/showthread.php?s=&threadid=71749&rand=35
 

Rashkin

Новичок
А почему нельзя

SELECT * FROM `таблица 2` WHERE `Поле 1` IN (SELECT id
FROM `таблица 1` WHERE id BETWEEN 1 AND 3 ) ??
 

alpine

Новичок
Rashkin
1) Ты не понял задачу. Прочитай внимательно первый пост.
2) Почему ты уверен что у него SELECT VERSION() > 4.1 ?
3) Почему этот подзапрос
IN(SELECT id FROM `таблица 1` WHERE id BETWEEN 1 AND 3)
сразу нельзя заменить на IN(1,2,3) ?
 

Bor-ka

Новичок
select q_q_t.question_id from table2 as q_l_t, tabke1 as q_q_t where q_l_t.keyword_id IN (2,4) and q_q_t.question_id=q_l_t.query_question_id group by q_l_t.question_id having count(distinct q_l_t.keyword_id)=2 order by question_data desc
 
Сверху