MySQL запрос отношений - PullRequest
5 голосов
/ 29 июня 2011

У меня две таблицы, 1-я:

users(id,name, birth_date)
skills(user_id,skill_name,skill_level)

Я хочу выбрать всех пользователей с 3 навыками на уровне 2.

можно ли сделать это одним запросом?

пример:

user has
3,marcus,19/03/1989
4,anderson,08/02/1990

skills has
3,php,2
3,html,1
4,php,1

я хочу: всех пользователей, у которых есть php 2 и html 1.

Ответы [ 3 ]

5 голосов
/ 29 июня 2011
select *
   from users u join skills s on u.id=s.user_id 
   where skill_level=2 
   group by id 
   having count(*)>2
1 голос
/ 29 июня 2011

Хорошо.Теперь, когда вы обновили свой вопрос немного больше, ответ становится «да, это можно сделать, но вы не обязательно должны делать это так».

Во-первых, просто чтобы показать, что это может бытьготово:

SELECT u.* FROM users u 
INNER JOIN skills s1 ON (u.id = s1.user_id AND s1.skill_name = 'php') 
INNER JOIN skills s2 ON (u.id = s2.user_id AND s2.skill_name = 'html') 
WHERE s1.skill_level = 2 AND s2.skill_level = 1 GROUP BY u.id;

Если бы вы объяснили, что вы хотели вначале, я бы сэкономил немного времени при наборе текста!:)

Теперь вы должны сделать выше?Это не очень красиво, но принцип в том, что вы присоединяетесь к столу дважды для обоих умений, используя псевдонимы (s1 и s2), чтобы скрыть тот факт, что это одна и та же таблица.Иногда это правильный подход.Проблема в том, что я подозреваю, что у вас будет множество вариаций, когда вам захочется иногда найти людей с большим количеством навыков на разных уровнях, иногда только один, и так далее.Вы могли бы найти, что написание кода для автоматической генерации этих запросов немного сложнее, и он не обязательно будет хорошо масштабироваться.

Вам нужно , чтобы ознакомиться с нормализацией базы данных, чтобы лучше проектировать ваши таблицы.И у вас также должно быть поле id для таблицы навыков, и тогда вам будет проще использовать подзапросы, когда вам нужно.

0 голосов
/ 29 июня 2011

Чтобы получить список пользователей, имеющих навык HTML 1 и навык PHP 2:

SELECT u.name
FROM users u JOIN skills s1 ON u.id = s1.user_id AND s1.skill = 'php'
JOIN skills s2 ON u.ud = s2.user_id AND s2.skill = 'html'
WHERE s1.skill_level = 2
AND s2.skill_level = 1

Если вы хотите, чтобы все пользователи имели HTML и PHP, вы можете полностью удалить предложение WHERE. Если вы хотите, чтобы все пользователи с навыком PHP как минимум 2, вы просто измените предложение на

s1.skill_level >= 2
...