![]() |
|
Модераторы: skyboy |
![]()
|
|
| Alx |
|
|||
|
Ajaxy ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: нет Всего: 78 |
Всем привет!
Второй день пытаюсь сообразить, как написать запрос: Есть таблица user и join-таблица user_skill. Скиллы бывают разных типов, поэтому на вход имеется несколько множеств id-шников скиллов (наборы уже готовые приходят из PHP), и задача выбрать тех юзеров, которые удовлетворяют хотя бы одному скиллу из всех множеств. Например: user_skill: ----- user_id | skill_id 1 | 1 2 | 2 1 | 3 2 | 4 1 | 5 То есть у user#1 скиллы 1, 3, 5, это все скиллы разных типов и на вход поступает что-то типа
Это и должно вернуть user#1. (Но не user#2, так как у него нет ни skill#5, ни skill#6). Заранее спасибо! PS - есть вариант, что мне вообще надо как-то по-другому архитектуру спроектировать, так что поправьте, если c этим ошибся. |
|||
|
||||
| Arantir |
|
||||
|
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: нет Всего: 55 |
IN не только по 2 значения принимает. Теоретически - до бесконечности. Не совсем понял, что именно вы хотите ввести и что на основе этого получить. Если вы имеете список значений и надо выбрать строку с соответствием хотя бы одному значению, то измените свой запрос, например, так:
Это сообщение отредактировал(а) Arantir - 28.11.2012, 13:22 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||
|
|||||
| Alx |
|
|||
|
Ajaxy ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: нет Всего: 78 |
Знаю, что IN не только по два значения принимает, это для примера.
Есть группы ID-шников скиллов (допустим три группы) [1, 2], [3, 4] и [5, 6]. Нужно выбрать пользователей, у которых есть хотя бы по одному скиллу из каждой группы. Пример таблицы см. выше. |
|||
|
||||
| Arantir |
|
|||
|
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: нет Всего: 55 |
А, ну теперь понятнее =) Тогда логически вроде бы правильно. Если хоть для одного IN ни одного скила не попадется, то будет FALSE. Но, по-моему, LEFT JOIN вытянет в результаты и неподходящие поля... Точнее не поля, а сточки с NULL-ками. Обрабатывать потом неудобно. Это сообщение отредактировал(а) Arantir - 28.11.2012, 13:35 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
| igorold |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 22.12.2005 Где: Россия->Урал-& gt;Миасс Репутация: 5 Всего: 17 |
Alx, по вашему запросу вы ничего не получите.
Вы хотите выбрать записи из одной таблицы, у которой поле принимает одно значение, а вы хотите, чтобы оно одновременно
Вам надо запрос строить наоборот - от таблицы user и к ней left join-ом присоединять user_skill - столько раз, сколько у вас есть групп условий, группировать по индексу user-а и выбирать те записи, в которых по всем join-ам индекс присоединенной записи not null -------------------- ... у семи нянек 14 сисек ... Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Напрашивается существование таблицы (скилл - группа скиллов). Когда она появится, всё станет достаточно простым делом:
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| igorold |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 557 Регистрация: 22.12.2005 Где: Россия->Урал-& gt;Миасс Репутация: 5 Всего: 17 |
А если эти "наборы скилов" динамические и каждый раз разные?
ТС неплохо бы уточнить исходные данные. -------------------- ... у семи нянек 14 сисек ... Putin here, Putin there, Putin almost everywhere! |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Тогда это будет сеансовая темп-таблица... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Alx |
|
|||
|
Ajaxy ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: нет Всего: 78 |
Akina, спасибо, но не очень понял твой пример, можешь объяснить подробнее?
Скилы пользователь выбирает галочками из нескольких наборов чекбоксов, например, отдельно цвет кожи: светлый, желтый; отдельно цвет глаз: серый, карий; отдельно страны: Россия, Америка, Франция. Причем таблица skill (грубо говоря) имеет вид skill_id | type | name 1 | skin | светлый 2 | skin | желтый 3 | skin | черный 4 | eyes | серый 5 | eyes | голубой 6 | eyes | карий 7 | loc | Россия ... и т.д. + m2m join-таблица пользователь-скилл. |
|||
|
||||
| Alx |
|
||||||||
|
Ajaxy ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2903 Регистрация: 26.11.2003 Где: Cutopia Репутация: нет Всего: 78 |
Получилось сделать как советовал igorold:
Правда не понадобилась часть
Насколько этот запрос оптимален по скорости? Добавлено через 14 минут и 48 секунд Еще один вариант получилось использовать:
Какой из них предпочтительнее? Я так думаю второй медленнее, лучше сразу не выбирать лишние записи. Кстати почему то
не работало у меня (может что не так написал?), пришлось заменить на > 0 Это сообщение отредактировал(а) Alx - 6.12.2012, 16:10 |
||||||||
|
|||||||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |