Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [mysql] Нужна выборка наподобие IN ALL(1,4,5,6) 
V
    Опции темы
Wowa
Дата 22.5.2008, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Есть таблица:
Код

id,tag_id
1,1
1,2
1,3
2,1
2,5
2,6


Primary key(id,tag_id)

Нужно выбрать все id, tag_id которых находится ВО ВСЕХ значения массива цифр (1, 2..)

PM WWW   Вверх
Fortop
Дата 22.5.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 2
Всего: 42



Так не сработает?

Код

SELECT id, tag_id FROM table as T 
WHERE EXISTS(SELECT value FROM ARRAY WHERE  value LIKE '%' +T.tag_id+'%')


Что за СУБД?

Добавлено через 18 секунд
ARRAY - это таблица с значениями


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
v2v
Дата 22.5.2008, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Цитата(Fortop @  22.5.2008,  22:20 Найти цитируемый пост)

Что за СУБД?

mysql.
помоему такой запрос вернёт не то что надо .


--------------------
PM   Вверх
Wowa
Дата 22.5.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(Fortop @  22.5.2008,  21:20 Найти цитируемый пост)
Так не сработает?

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

Цитата(Fortop @  22.5.2008,  21:20 Найти цитируемый пост)
Что за СУБД?

mysql. 
PM WWW   Вверх
Stampede
Дата 22.5.2008, 22:48 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 1
Всего: 144



Wowa, я так полагаю, дубликатов пар (id, tag_id) в таблице нет? Тогда можно воспользоваться тем фактом, что присутствие ВСЕХ нужных значений tag_id для некоего id произведет ровно N вхождений в выборке, где N - число элементов в списке. Переводя это в SQL, получим что-то вроде:

Код

select id
    from table
    where tag_id in (1, 4, 5, 6)
    group by id
    having count(distinct tag_id) = 4


Кстати, с квалификатором distinct в последней строчке запрос сработает правильно даже при наличии дубликатов пар. Надо только будет дополнительно (програмно, я так понимаю) подсчитывать количество элементов в списке, чтобы включать это число в условие having.



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
v2v
Дата 22.5.2008, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Stampede, этого условия не достаточно.
вы проверяете (1, 4, 5, 6) , а в базе есть тэги : 1,2,3,4

Добавлено через 15 секунд
* ну это в общем случае


--------------------
PM   Вверх
Fortop
Дата 22.5.2008, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 2
Всего: 42



v2v, достаточно, ведь список составляешь ты при запросе сам.

Добавлено через 33 секунды
ИМХО, решение Stampede, близко к оптимальному.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Wowa
Дата 22.5.2008, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Stampede, спасибо. Изящно! smile
PM WWW   Вверх
Stampede
Дата 22.5.2008, 23:21 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 1
Всего: 144



Цитата(v2v @  22.5.2008,  14:00 Найти цитируемый пост)
вы проверяете (1, 4, 5, 6) , а в базе есть тэги : 1,2,3,4


То и? Они и не попадут в выборку (см. условие where в стр. 3). Если на пальцах, то запрос работает следующим образо. Еесли кто еще не понял, речь идет о поиске по совпадению _всех_ ключевых слов: поэтому давайте для наглядности говорить об объявлениях о продаже автомобилей, где люди могут описать свое авто набором ключевых слов, по которым их смогут найти, например: "хонда цивик 2003 белый коробка хетчбек".

Допустим заходит кто-то и выдает запрос: "мазда 6 дизель". Что мы делаем?

Мы первым делом берем и отбираем _только_ те записи в таблице ключевых слов, у которых ключевое слово или "мазда", или "6", или "дизель":

Код

select * from table where keyword in ('мазда', '6', 'дизель');


В ответ на это нам вернут строки, где нет ничего лишнего. Тогда нам остантся только сгруппировать эти записи по ID объявления, и мы сразу увидим, у какого объявления сколько присутствует ключевых слов из заданного пользователем списка:

(1234, "мазда")
(1234, "6")

(2345, "дизель")

(3456, "мазда")
(3456, "дизель")
(3456, "6")

Отсюда уже видно, что нашему критерию поиска соответствует только одно объявление под номером 3456. При этом данному объявлению описывается еще многоми ключевыми словами, такими как "зеленый", "2001", "седан", но нас они в данном случае совершенно не интересуют, поэтому мы их сразу и исключили формулировкой условия в where.

Так понятнее? smile



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
v2v
Дата 22.5.2008, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1620
Регистрация: 20.9.2006
Где: Киев

Репутация: нет
Всего: 56



Цитата(Stampede @  22.5.2008,  23:21 Найти цитируемый пост)
Они и не попадут в выборку (см. условие where в стр. 3).

супер, я этот момент упустил... хотя условие с having крутилось в голове ...


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0674 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.