![]() |
|
Модераторы: skyboy |
![]()
|
|
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Есть таблица:
Primary key(id,tag_id) Нужно выбрать все id, tag_id которых находится ВО ВСЕХ значения массива цифр (1, 2..) |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 2 Всего: 42 |
Так не сработает?
Что за СУБД? Добавлено через 18 секунд ARRAY - это таблица с значениями -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: нет Всего: 56 |
||||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
||||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 1 Всего: 144 |
Wowa, я так полагаю, дубликатов пар (id, tag_id) в таблице нет? Тогда можно воспользоваться тем фактом, что присутствие ВСЕХ нужных значений tag_id для некоего id произведет ровно N вхождений в выборке, где N - число элементов в списке. Переводя это в SQL, получим что-то вроде:
Кстати, с квалификатором distinct в последней строчке запрос сработает правильно даже при наличии дубликатов пар. Надо только будет дополнительно (програмно, я так понимаю) подсчитывать количество элементов в списке, чтобы включать это число в условие having. -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
|||
|
||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: нет Всего: 56 |
Stampede, этого условия не достаточно.
вы проверяете (1, 4, 5, 6) , а в базе есть тэги : 1,2,3,4 Добавлено через 15 секунд * ну это в общем случае |
|||
|
||||
| Fortop |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2200 Регистрация: 13.11.2007 Где: Донецк Репутация: 2 Всего: 42 |
v2v, достаточно, ведь список составляешь ты при запросе сам.
Добавлено через 33 секунды ИМХО, решение Stampede, близко к оптимальному. -------------------- Мир это Я. Живее всех живых. |
|||
|
||||
| Wowa |
|
|||
|
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Stampede, спасибо. Изящно!
|
|||
|
||||
| Stampede |
|
|||
![]() Гносеолог ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 1 Всего: 144 |
То и? Они и не попадут в выборку (см. условие where в стр. 3). Если на пальцах, то запрос работает следующим образо. Еесли кто еще не понял, речь идет о поиске по совпадению _всех_ ключевых слов: поэтому давайте для наглядности говорить об объявлениях о продаже автомобилей, где люди могут описать свое авто набором ключевых слов, по которым их смогут найти, например: "хонда цивик 2003 белый коробка хетчбек". Допустим заходит кто-то и выдает запрос: "мазда 6 дизель". Что мы делаем? Мы первым делом берем и отбираем _только_ те записи в таблице ключевых слов, у которых ключевое слово или "мазда", или "6", или "дизель":
В ответ на это нам вернут строки, где нет ничего лишнего. Тогда нам остантся только сгруппировать эти записи по ID объявления, и мы сразу увидим, у какого объявления сколько присутствует ключевых слов из заданного пользователем списка: (1234, "мазда") (1234, "6") (2345, "дизель") (3456, "мазда") (3456, "дизель") (3456, "6") Отсюда уже видно, что нашему критерию поиска соответствует только одно объявление под номером 3456. При этом данному объявлению описывается еще многоми ключевыми словами, такими как "зеленый", "2001", "седан", но нас они в данном случае совершенно не интересуют, поэтому мы их сразу и исключили формулировкой условия в where. Так понятнее? -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
|||
|
||||
| v2v |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1620 Регистрация: 20.9.2006 Где: Киев Репутация: нет Всего: 56 |
супер, я этот момент упустил... хотя условие с having крутилось в голове ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |