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