mysql: объединение таблиц + поиск записей по запросу в стиле AND вместо OR - PullRequest
3 голосов
/ 12 декабря 2008

Примечание: использование 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, если подзапросы - лучший вариант.

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

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

HAVING COUNT( * ) > 5

Ответы [ 3 ]

2 голосов
/ 12 декабря 2008

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

SELECT user_id
FROM skills
WHERE skill_id IN (51, 52, 53, 54, 55)
GROUP BY user_id
HAVING COUNT(*) = 5;
1 голос
/ 12 декабря 2008

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

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

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

0 голосов
/ 12 декабря 2008

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

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
...