我有以下情况:
Table 1:
articles
id article_text category author_id
1 "hello world" 4 1
2 "hi" 5 2
3 "wasup" 4 3
Table 2
authors
id name friends_with
1 "Joe" "Bob"
2 "Sue" "Joe"
3 "Fred" "Bob"
我想知道给定类别的“Bob”朋友的作者总数。
因此,例如,对于类别4,有多少作者是“Bob”的朋友。
作者表非常大,在某些情况下,我有一百万作者是“鲍勃”的朋友
所以我尝试过:
获取与bob成为朋友的作者列表,然后遍历它们并获取该给定类别中每个类别的计数,并在我的代码中将所有这些计算在一起。
这种方法的问题是它可以生成一百万个查询,即使它们非常快,似乎应该有更好的方法。
我正在考虑尝试获取与bob成为朋友的作者列表,然后使用该列表构建IN子句,但我担心这会破坏查询集中允许的内存量。
似乎这是一个常见问题。有什么想法吗?
感谢
答案 0 :(得分:1)
SELECT COUNT(DISTINCT auth.id)
FROM authors auth
INNER JOIN articles art ON auth.id = art.author_id
WHERE friends_with = 'bob' AND art.category = 4
需要Count(Distinct a.id),因为文章可能会为每位作者命中多行。
但是如果您对数据库有任何控制权,我会使用friends_with的链接表作为您的cussrent解决方案要么必须使用逗号分隔的名称列表,这将对性能造成灾难性的要求,或者需要完全不同的查询或每个作者都可以只有一个朋友。
友
id friend_id
然后查询看起来像这样
SELECT COUNT(DISTINCT auth.id)
FROM authors auth
INNER JOIN articles art ON auth.id = art.author_id
INNER JOIN friends f ON auth.id = f.id
INNER JOIN authors fauth ON fauth.id = f.friend_id
WHERE fauth.name = 'bob' AND art.category = 4
它更复杂,但允许很多朋友,只需要记住,这个结构要求每对朋友有2行,一个从joe到bob,一个从bob到joe。
您可以以不同方式构建它,但这会使查询更加复杂。
答案 1 :(得分:0)
也许像
select fr.name,
fr.id,
au.name,
ar.article_text,
ar.category,
ar.author_id
from authors fr, authors au, articles ar
where fr.id = ar.author_id
and au.friends_with = fr.name
and ar.category = 4 ;
只是计数...
select count(distinct fr.name)
from authors fr, authors au, articles ar
where fr.id = ar.author_id
and au.friends_with = fr.name
and ar.category = 4 ;
答案 2 :(得分:0)
不使用连接的版本(希望可以使用!)
来自authors_with ='Bob'和id in的作者的SELECT count(distinct id)(从category = 4的文章中选择author_id)
当我开始使用SQL时,我发现使用'IN'更容易理解语句。