2010-04-28 5 views
3

Я довольно новичок в mysql, и я понятия не имею, движется ли я в правильном направлении, но у меня возникают проблемы с запросом mysql.Проблема с использованием mysql joins

Я в принципе есть таблица пользователей

id  name 
---- -------- 
1  user1   
2  user2   
3  user3   
4  user4 

, а также таблицу атрибутов пользователя

id  userid attribute 
---- ----- ------ 
1  1  5   
2  1  6  
3  2  5   
4  3  4 

Я хочу, чтобы иметь возможность выбрать пользователей, которые имеют как атрибут 5 и атрибут 6, поэтому в этом случае я хочу вернуть

Я пробовал использовать подобное соединение.

SELECT u.id, u.name FROM users u LEFT JOIN attributes a ON (a.userid = u.id) WHERE a.attribute = 5 AND a.attribute = 6 

Но, очевидно, что это не сработает, что это лучший способ сделать это?

ответ

0
SELECT u.id, u.name FROM users u 
    INNER JOIN attributes a1 ON u.id = a1.userid 
    INNER JOIN attributes a2 ON u.id = a2.userid 
WHERE a1.attribute = 5 AND a2.attribute = 6 
4

Один из способов сделать это - использовать два соединения; например:

SELECT ... 
FROM users u 
    JOIN attributes a5 ON u.id = a5.userid AND a5.attribute = 5 
    JOIN attributes a6 ON u.id = a6.userid AND a6.attribute = 6 

Другой способ заключается в группировке (обратите внимание, что я MS SQL человек, не уверен, если это правильный синтаксис для MySQL или нет):

SELECT u.id, u.name 
FROM users u 
    JOIN attributes a ON u.id = a.userid 
WHERE a.attribute IN (5,6) 
GROUP BY u.id, u.name 
HAVING COUNT(*) = 2 
+0

Очень приятно. Мне нравится решение для группировки. Я был уверен, что должен быть лучший способ, чем иметь соединение для каждого обязательного атрибута. – Zarigani

0

Изменение запроса, как это будет работать:

Выбрать все из таблицы атрибутов, которая равна 5 или 6, а затем проверить пользователей, которые соответствуют.

SELECT a.id, u.name 
FROM attributes AS a 
LEFT JOIN users AS u ON a.id = u.id 
WHERE a.attribute = 5 OR a.attribute = 6 
+1

@Frankie: смешно, как все, кроме вас, не заметили такой простой ошибки :) –

+0

@ Alexander: Я думаю, вопрос очень склонен к таблице пользователей, и люди сразу начинают думать об этом как о первом запросе. Спасибо за комментарий! – Frankie

0

Основываясь на ваш вопрос, я не думаю, что другие два текущих ответы являются удовлетворительными.

Если вы хотите:

выберите пользователей, которые имеют как атрибут 5 и атрибут 6

Следующий запрос является одним из способов достижения этой цели:

select 
    * 
from 
    users 
where 
    id in (select userid from attributes where attribute = 5) 
    and 
    id in (select userid from attributes where attribute = 6)