2015-07-07 1 views
1

У меня есть 3 таблицы:MYSQL: выбрать из многих ко многим таблице связующей

1) упражнение: exercise_id, имя

2) Оборудование: equipment_id, имя

3) exercise_equipment: exercise_id , equipment_id - это таблица ссылок между упражнениями и оборудованием. В этой таблице для одного упражнения может потребоваться несколько единиц оборудования, и одно и то же оборудование может использоваться для многих упражнений.

CREATE TABLE exercise 
    (`ex_id` int, `name` varchar(30)) 
; 
INSERT INTO exercise 
    (`ex_id`, `name`) 
VALUES 
    (1, 'push ups'), 
    (2, 'sit ups'), 
    (3, 'squats'), 
    (4, 'push ups with a fitness ball') 
; 

CREATE TABLE equipment 
    (`eq_id` int, `name` varchar(30)) 
; 
INSERT INTO equipment 
    (`eq_id`, `name`) 
VALUES 
    (1, 'none'), 
    (2, 'mat'), 
    (3, 'ball') 
; 

CREATE TABLE exercise_equipment 
    (`ex_id` int, `eq_id` int) 
; 
INSERT INTO exercise_equipment 
    (`ex_id`, `eq_id`) 
VALUES 
    (1, 2), 
    (2, 2), 
    (3, 1), 
    (4, 2), 
    (4, 3) 
; 

Что мне нужно сделать, это выбрать все упражнения, которые пользователь может делать с оборудованием, которое он имеет (например, 1 и 2 - нет оборудования или мат).

Я нашел несколько примеров и попытался следующие запросы с внутренним соединением и где:

SELECT ex.ex_id, ex.name from exercise ex 
LEFT JOIN exercise_equipment exeq ON ex.ex_id = exeq.ex_id 
WHERE exeq.eq_id IN (1,2); 

и

select ex_id, name from exercise 
where ex_id in (select ex_id from exercise_equipment where eq_id in (1,2)); 

Но они возвращаются все упражнения, а не только первые три. В этом случае, если пользователь хочет выполнять упражнения, которые не требуют оборудования или мата (1 и 2), я хочу, чтобы отжимания, сидения и приседания возвращались, но не упражнение с мячом.

Я надеюсь, что мои разъяснения понятны. Я бы очень признателен за любую помощь, которую я могу получить!

ответ

0

Вы хотите использовать упражнения, которые используют только 1 и 2. Когда вы используете предложение WHERE, вы отфильтровываете все другое оборудование, чтобы оно не срабатывало.

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

SELECT ex.ex_id, ex.name 
FROM exercise ex LEFT JOIN 
    exercise_equipment exeq 
    ON ex.ex_id = exeq.ex_id 
GROUP BY ex.ex_id, ex.name 
HAVING SUM(exeq.eq_id NOT IN (1, 2)) = 0; 

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

HAVING COALESCE(SUM(exeq.eq_id NOT IN (1, 2)), 0) = 0; 
+0

Это именно то, что мне нужно! Спасибо! – user5087295

Смежные вопросы