2013-05-17 72 views
4

将这两个SQL语句合并为一个的最佳方式是什么?我尝试过使用联盟,但似乎无处可去。将这两个SQL语句合并为一个

select id as id from likes where type=1; 

select sum(votes) as votes from likes where parent=id; 

这里是likes表:

id type parent country votes 
1  1  0  US  0 
2  2  1  US  6 // This + 
19  3  1  US  3 // This 
3  3  2  US  3 
7  3  2  US  3 
4 10  3  US  1 
5 10  3  US  1 
6 10  3  US  1 
10 10  7  US  1 
9 10  7  US  1 
8 10  7  US  1 
20 10  19  US  1 
21 10  19  US  1 
22 10  19  US  1 

这是我想要达到的效果:

id | votes 
--------------- 
1 | 9 
+0

他们做不同的事情。你想达到什么目的? –

+0

我已经更新了表格和我正在尝试完成的问题。 – Norman

回答

5

试试这个:

SELECT 
    l1.id, 
    SUM(l2.votes) AS Totalvotes 
FROM likes AS l1 
INNER JOIN likes AS l2 ON l1.id = l2.parent 
WHERE l1.type = 1 
GROUP BY l1.id; 

看到它在此采取行动:

这会给你:

| ID | TOTALVOTES | 
------------------- 
| 1 |   9 | 
+0

您的解决方案为我提供了每一行。 – Norman

+0

是的。谢谢。这很好。一件小事,在我走之前,如果我需要指定另一个条件,我该在哪里做?像这样:WHERE l1.type = 1和l1.country ='us''? – Norman

+0

@Norman - 是的,像这样'WHERE l1.type = 1 and l1.country ='us'':http://sqlfiddle.com/#!2/132fe/2 –

2
SELECT SUM(votes) AS votes 
FROM likes 
WHERE parent IN (SELECT id FROM likes WHERE type=1) 

HTH

0

你可以试试这个

select id,sum(votes) as votes from likes where type=1 and parent=id; 

希望这有助于

+0

这应该是有效的,我不知道为什么我得到NULL NULL – Norman

+0

它不会工作,因为你将在同一行内操作,即你真的在寻找父母和id相等的行。您需要在同一个表上使用子查询或联接 - 无需避免。 –

1

这应该解决您的问题,我相信:

SELECT parent AS id, SUM(votes) AS votes FROM likes WHERE parent IN (SELECT id FROM likes WHERE type = 1) GROUP BY parent; 
+0

0 | 0.你见过我更新的问题吗? – Norman

+0

对不起,我没有把这个问题笼罩在这个问题上。更新后的答案*应该*起作用,尽管我现在无法真正测试它。 –

+0

现在就开始工作。只是一些测试。 – Norman