2013-05-22 2 views
1

Хорошо, я попытался посмотреть все более StackOverflow, и самое близкое решение, которое я нашел это: mysql AND clause on same column multiple timesMYSQL сравнить значения из одинаковых столбцов

Но я не могу использовать операторы и «имеющий» синтаксис не будет работать, потому что группы. Там ДОЛЖНО быть простым решением.

2 таблиц выглядит следующим образом (упрощенно):

пользователей:

uid name 
1 person 1 
2 person 2 
3 person 3 

категории:

uid value 
1 actor 
1 musician 
2 actor 
3 dancer 
4 musician 
4 dancer 

Я хочу, чтобы получить UID из тех, что 2 значения на в то же время. Например, я хочу получить UID, который является актером и музыкантом. Не только одно значение, но и то и другое должно быть обязательным!

Сначала я попытался это:

SELECT users.uid, users.name 
FROM 
users 
LEFT OUTER JOIN categories ON users.uid = categories.uid 
WHERE (categories.value = 'actor' AND categories.value = 'musician') 
GROUP BY u.uid; 

Это, конечно, не работает, так как одна строка не может иметь 2 значения.

Кто-нибудь знает решение?

ответ

4

Вы можете присоединиться к несколько раз categories таблицы, чтобы получить результат:

SELECT users.uid, users.name 
FROM users 
INNER JOIN categories c1 
    ON users.uid = c1.uid 
INNER JOIN categories c2 
    ON users.uid = c2.uid 
WHERE c1.value = 'actor' 
    AND c2.value = 'musician'; 

См SQL Fiddle with Demo

+0

Это один сделал это работает для меня. Мой db более сложный, чем этот, но я упростил проблему, и мне нужно «перевести» ее в API DB Drupal, возможно, поэтому использование «having» не работает, или, возможно, потому, что я присоединился к 5 другим таблицам ... I не знаю, моя первая мысль заключалась в том, что «группа по» выводит только 1 строку, поэтому счет всегда будет 1, но я не знаю ... –

3

Используйте having пункт

SELECT u.uid, u.name 
FROM users u 
LEFT OUTER JOIN categories c ON u.uid = c.uid 
WHERE c.value = 'actor' OR c.value = 'musician' 
GROUP BY u.uid 
having count(distinct c.value) > 1 
4
SELECT users.uid, users.name 
FROM users 
    LEFT JOIN categories ON users.uid = categories.uid 
WHERE categories.value in ('actor', 'musician') 
GROUP BY u.uid, users.name 
having count(distinct categories.value) = 2; 
0

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

SELECT uid, name 
FROM users 
WHERE 
uid IN (SELECT uid FROM categories WHERE value='actor') 
AND uid IN (SELECT uid FROM categories WHERE value='musician') 

Но на самом деле ничего плохого в использовании HAVING;)

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