2013-07-16 34 views
-3

说我有一张桌子的人,一张桌子上的水果和一张桌子都喜欢。选择并由多个行值确定

People    fruit    likes 
+-----+--------+ +-----+---------+ +-----+-----+ 
| pid | people | | fid | name | | pid | fid | 
+-----+--------+ +-----+---------+ +-----+-----+ 
| 1 | Mary | | 1 | appple | | 1 | 1 | 
| 2 | Tom | | 2 | orange | | 2 | 1 | 
| 3 | John | | 3 | banana | | 2 | 2 | 
| 4 | George | | 4 | coconut | | 2 | 3 | 
... 

我想打一个查询,可以搜索的人谁喜欢苹果和橘子:

Result 
+----------+--------------- 
| People | likes 
+----------+--------------- 
| Tom  | apple, orange, banana 

其实,我也想知道how to make the same output above but with different conditions说,人们谁喜欢橙色的,但不是苹果或人谁不喜欢香蕉等

+0

这是一个基本的SQL查询,你可以尝试自己 –

+0

我试过......无论如何我得到了我的答案。谢谢 – user1510539

回答

1
SELECT people 
FROM  People 
    JOIN likes USING (pid) 
    JOIN fruit USING (fid) 
GROUP BY pid 

然后:

  1. 人谁喜欢苹果和橘子

    HAVING SUM(name='apple') AND SUM(name='orange') 
    
  2. 人谁喜欢橙色的,但不是苹果

    HAVING SUM(name='orange') AND NOT SUM(name='apple') 
    
  3. 人谁喜欢橙色的,但不是苹果

    HAVING NOT SUM(name='banana') 
    

见他们在sqlfiddle

+0

好!这工作:)事实上,我花了一整天的内心正确和左加入和GROUP_CONCAT一整天。无论如何变得非常沮丧:( – user1510539

0
SELECT p.people, GROUP_CONCAT(DISTINCT f.name) 
FROM people p INNER JOIN likes l ON p.pid = l.pid 
    INNER JOIN fruit f ON l.fid = f.fid 
WHERE p.id = 2 
GROUP BY p.people