SQL从2个表中获取数据

时间:2015-02-09 20:05:27

标签: sql

我有一个棘手的问题(至少对我来说这很棘手),我想通过评论计数来安排数据。我的第一个表叫做all_comments,它有这些列(更多但不是必需的):

comment, target_id

我的第二个表名为our_videos,其中包含以下列(更多但不是必需的):

id, title

我想得到所有注释的计数,这些注释的target_id与第二个表上的id相同,并按注释计数排列数据。这是我想要的例子:

表#1:

id    target_id
----------------
1        3
2        5
3        5
4        3
5        3

表#2:

id   title
-----------
1    "test"
2    "another-test"
3    "testing"
5    "......"

这基本上是说数据,即在第二个数据库中,id为3有3个注释,id为5的数据有2个注释,我想通过这个注释计数排列数据,得到结果像这样:

结果:

id    title
----------------
3     "testing"
5     "......."
1     "test"
2     "another-test"

如果我错过了这个问题所需的任何重要信息,请询问,感谢您的帮助,和平:)

3 个答案:

答案 0 :(得分:2)

这是非常简单的查询,你一定要查看任何sql教程

天真的变体将是:

select videos.id, videos.title, count(*) as comment_count
from videos
left outer join
comments
on (videos.id = comments.target_id)
group by videos.id, videos.title
order by comment_count desc

这个版本有一些性能问题,因为你必须按名称分组,为了加快它我们通常做下一件事:

select videos.id, videos.title, q.cnt as comment_count
from videos
left outer join
(
    select target_id, count(*)
    from comments
    group by target_id
) as q
on videos.id = q.target_id
order by q.cnt DESC

答案 1 :(得分:0)

select videos.id, videos.title, isnull(cnt, 0) as cnt
from videos
left outer join 
    (select target_id, count(*) as cnt
    from comments
    group by target_id) as cnts
on videos.id = cnts.target_Id
order by isnull(cnt, 0) desc, videos.title

答案 2 :(得分:0)

有些系统会让你写这个,即使排序不严格应该发生在输出中没有包含的列上。我不一定会推荐它,但我认为它是最直接的。

select id, title from videos
order by (select count(*) from comments where target_id = videos.id) desc, title

如果您不介意在输出中使用它,那么这是一个快速的变化:

select id, title from videos,
    (select count(*) from comments where target_id = videos.id) as comment_count
order by comment_count desc, title

SQL通常有很多选项。