mysql: объединение таблиц + поиск записей по запросу в стиле AND вместо OR

Примечание: использование MySQL 4.0, что означает отсутствие подзапросов (в настоящее время).

У меня есть 2 таблицы:

  • Таблица "user_details"
  • Таблица "навыков", в которой есть user_id и "skill_id", которые отображаются в предопределенный набор навыков, определенных в другом месте.

Текущий запрос позволяет администратору искать пользователей, выбирая навыки, и запрос работает в режиме ИЛИ, например:

LEFT JOIN skills 
ON (ud.user_id = skills.user_id)  
WHERE skills.skill_id in (51, 52, 53, 54, 55)
GROUP BY ud.user_id

Это возвращает слишком много записей, и поэтому я хочу, чтобы это поле поиска работало в стиле AND, где пользователь должен иметь ВСЕ выбранные навыки, которые будут возвращены при поиске.

Может быть возможно обновить MySQL, если подзапросы являются лучшим вариантом.

редактирование: что-то связанное с группировкой, подсчетом, наличием и т. д. Можете ли вы ограничить группу по команде, указав, сколько совпадений вы возвращаете? (например, 5 в этом примере).

edit2: тестирование:

HAVING COUNT( * ) > 5

3 ответа

Решение

Вам не нужен подзапрос или объединение.

SELECT user_id
FROM skills
WHERE skill_id IN (51, 52, 53, 54, 55)
GROUP BY user_id
HAVING COUNT(*) = 5;

Просто добавьте больше одиночных соединений.

ВНУТРЕННИЕ ПРИСОЕДИНЕНИЯ Навыки s ON u.id - us.userid AND skill_id = $s1
ВНУТРЕННИЕ РЕЙТИНГИ НАВЫКНУЮ НАВЫКИ
ВНУТРЕННИЕ РЕЙТИНГИ НАВЫКНУЮ НАВЫКИ
ВНУТРЕННИЕ ПРИСОЕДИНЕНИЯ Навыки s ON u.id - us.userid AND skill_id = $s4
и т.п.

Потребуется присоединиться ко всем. Вам не нужны какие-либо группы или счета.

Если вы хотите, чтобы пользовательские данные были включены в тот же запрос, вы можете просто сделать следующее:

SELECT * FROM user_details  
JOIN skills USING (user_id) 
WHERE skill_id IN (51, 52, 53, 54, 55) 
GROUP BY user_id 
HAVING COUNT(*) = 5
Другие вопросы по тегам