2013-05-22 87 views
1

好吧,我想看看各地计算器,我发现的最接近的解决方案是这样的: 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 

我想那些2点的值在的UID同时。例如,我想获得演员和音乐家的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

这一个使得它为我工作。我的数据库比这个更复杂,但我简化了这个问题,而且我必须将它“翻译”到Drupal的数据库API,或许这就是为什么使用'有'没有用,或者因为我加入了5个其他表...我不知道,我的第一个想法是“group by”只有结果1行,所以count总是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