Помогите составить запрос к MySQL

Рома

был тут
Помогите составить запрос к MySQL

Есть таблица с такой структурой:

A B
1|1
1|2
1|3
2|1
2|4
2|5
3|2
3|3

А – это некоторое содержимое, В – некоторое ключевое слово. Надо составить запрос, который бы выбрал содержимое, которому соответствуют определенные слова. То есть, например, такой запрос: "выбрать все данные, которым присвоены слова 2 и 3" должен вернуть записи с полем А, равным 1 и 3. Запрос "выбрать все данные, которым присвоены слова 1, 2 и 3" должен вернуть запись с полем А, равным 1. Помогите оформить эти условия в виде SQL-запроса. Спасибо.

P.S. Желательно, чтобы возвращались данные с уникальным полем А, то есть в идеале на первый запрос я должен получить выборку:

А В
1|1
3|2,

а не:

A B
1|1
1|2
1|3
3|2
3|3
 

zerkms

TDD infected
Команда форума
вложенный запрос или 2 запроса
HAVING + COUNT + GROUP BY
 

Рома

был тут
А что должно возвращаться в поле В?
B мне вообще не нужно. А – это ид некоторого текста, который хранится в другой таблице, В – это ключевое слово (точнее тоже не слово, а ид ключевого слова, само ключевое слово хранится в третьей таблице).

Таким образом, в моем примере, тексту 1 присвоены ключевые слова 1, 2 и 3, тексту 2 присвоены ключевые слова 1, 4 и 5, тексту 3 присвоены ключевые слова 2 и 3.

Мне нужны ид текстов, удовлетворяющих условиям, которые задает пользователь. Условия, разумеется, могут меняться: "узнать ид текстов с ключевыми словами 2 и 3" или "узнать ид текстов с ключевыми словами 1, 2 и 3", например.

вложенный запрос или 2 запроса
HAVING + COUNT + GROUP BY
Сейчас попробую разобраться. А пример привести можешь?
 

zerkms

TDD infected
Команда форума
chira
запрос работает некорректно
замени
1 2
на
1 5

-~{}~ 06.03.07 16:56:

да и вообще HAVING AVG(b IN (2,3)) = 1 не имеет смысла после того как уже сделано WHERE b IN (2,3)
GROUP BY a. оно всегда будет 1
 

chira

Новичок
Предлагаю автору вопроса поиграться с разными вариантами ...
В приведённой задаче неявно предполагается уникальность сочитания полей A B. Об этом автор не указал. Поэтому заявление
да и вообще HAVING AVG(b IN (2,3)) = 1 не имеет смысла после того как уже сделано WHERE b IN (2,3)
GROUP BY a. оно всегда будет 1
поспешно
более универсальный случай сочетание AVG & COUNT(DISTINCT b) = 2, но для некоторых случаев это может быть избыточным.

автор может попробовать разные варианты:
AVG без WHERE
HAVING COUNT(*) = 2
HAVING COUNT(DISTINCT b) = 2
 

zerkms

TDD infected
Команда форума
в принципе если очень хочется в один запрос то можно:
[sql]
SELECT * FROM `table` `t1` INNER JOIN `table` `t2` ON `t2`.`id` = `t1`.`id` AND `t2`.`b` = 2 INNER JOIN `table` `t3` ON `t3`.`id` = `t2`.`id` AND `t3`.`b` = 3
[/sql]

если id в таблице нет но комбинация a & b уникальна - то можно и по ним сравнивать
 

chira

Новичок
Автор оригинала: zerkms
в принципе если очень хочется в один запрос то можно:
[sql]
SELECT * FROM `table` `t1` INNER JOIN `table` `t2` ON `t2`.`id` = `t1`.`id` AND `t2`.`b` = 2 INNER JOIN `table` `t3` ON `t3`.`id` = `t2`.`id` AND `t3`.`b` = 3
[/sql]

если id в таблице нет но комбинация a & b уникальна - то можно и по ним сравнивать
ты случаем не погорячился?
 

zerkms

TDD infected
Команда форума
хм...... думаю нет ;)
хотя запрос и не проверял

ps: конечно ещё надо GROUP BY сделать, но думаю тредстартер сможет и сам
 

chira

Новичок
zerkms
сам запрос должен работать, я думал о лишних двух соединениях таблиц, когда хватило бы одной таблицы с GROUP BY & COUNT
 
Сверху