SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.05.2010 21:38:55

oleg_l
Участник
Зарегистрирован: 20.05.2010
Сообщений: 3

Как выбрать записи на которые ссылаются 2 и более тега?

Попытаюсь объяснить подробнее:
Есть две таблицы - messages и tags. Таблица messages имеет такую структуру:

id title text
1  ...   ...
2  ...   ...
3  ...   ...
4  ...   ...

А tags такую:
id name      message
1  боевик   1
2  комедия 1
3  драма    2
4  история  1

Нужно выбрать из таблицы messages записи по нескольким тегам, т.е. например по тегам 'боевик', 'комедия', 'история' должна выбраться запись с id 1. Причем в записи из таблицы messages не должны дублироваться, так-как эта выборка будет использоваться в поиске по сайту и соответственно от неё зависит пагинатор и т.п.

Уже второй день пытаюсь найти решение, пока безрезультатно. Надеюсь кто нибудь здесь сможет мне помочь, буду очень благодарен.

Отредактированно oleg_l (20.05.2010 21:39:26)

Неактивен

 

#2 20.05.2010 23:15:27

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как выбрать записи на которые ссылаются 2 и более тега?

SELECT * FROM messages WHERE id IN(SELECT message FROM tags WHERE name='боевик' OR name='комедия' OR name='история');

Неактивен

 

#3 21.05.2010 00:09:46

oleg_l
Участник
Зарегистрирован: 20.05.2010
Сообщений: 3

Re: Как выбрать записи на которые ссылаются 2 и более тега?

Немного не то, видимо я плохо описал задачу. Нужно вытащить только те записи, на которые ссылаются все указанные теги ('боевик', 'комедия', 'история'), а не один из них.

Неактивен

 

#4 21.05.2010 00:49:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Как выбрать записи на которые ссылаются 2 и более тега?

SELECT * FROM messages WHERE id IN(SELECT message FROM tags WHERE name='боевик' OR name='комедия' OR name='история' GROUP BY message HAVING count(*)=3);

Неактивен

 

#5 21.05.2010 01:12:35

owlpic
Участник
Зарегистрирован: 19.05.2010
Сообщений: 7

Re: Как выбрать записи на которые ссылаются 2 и более тега?

Рискну поспорить, что смысл не правильный получается, как исходных таблиц, так и соответственно любых запросов к ним. Я в мускуле не мастер, но со стороны Си сделал бы битовые маски... К примеру маски:

Боевик - 0001
Комедия - 0010
Драма - 0100
История - 1000

То есть элемент, относящийся и к боевикам, и к комедиям, и к историям будет иметь соответствующее битовое значение поля 1011. Далее нужно сложить вместе необходимые маски и сверить со всеми записями в таблице. Как это сделать в мускуле, думаю Вам подскажут в этом местные специалисты smile

И еще я абсолютно не уверен, что для мускула это рациональное решение. Но битовые операции по-идее выполняются очень быстро.

Неактивен

 

#6 21.05.2010 15:44:47

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Как выбрать записи на которые ссылаются 2 и более тега?

Можно и через битовые маски. На равенство они очень даже ничего
будут работать. Ну и если список не меняется и количество вариантов
не более 64. Тогда можно и SET использовать wink

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson