Проблема с использованием соединений MySQL - PullRequest
3 голосов
/ 29 апреля 2010

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

У меня в основном есть таблица пользователей

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, поэтому в этом случае я хочу вернуть

id      name  
----    -------- 
1       user1  

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

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

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

Ответы [ 5 ]

4 голосов
/ 29 апреля 2010

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

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 голосов
/ 29 апреля 2010

Хм, я не сильно разбираюсь в SQL, возможно GROUP BY и HAVING помогут вам Проверьте ссылку: http://www.w3schools.com/sql/sql_having.asp

0 голосов
/ 29 апреля 2010

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

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

выберите пользователей, которые имеют оба атрибут 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)
0 голосов
/ 29 апреля 2010

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

Выберите все из таблицы атрибутов, равной 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
0 голосов
/ 29 апреля 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...