我找不到我的问题在这里的答案在stackoverflow。我有一个跨越3个表的查询:加入的sql条件计数
newsitem
+------+----------+----------+----------+--------+----------+
| Guid | Supplier | LastEdit | ShowDate | Title | Contents |
+------+----------+----------+----------+--------+----------+
newsrating
+----+----------+--------+--------+
| Id | NewsGuid | UserId | Rating |
+----+----------+--------+--------+
usernews
+----+----------+--------+----------+
| Id | NewsGuid | UserId | ReadDate |
+----+----------+--------+----------+
Newsitem显然包含newsitems,newsrating包含收视用户给newsitems,并usernews包含当用户阅读newsitem的日期。
在我的查询中,我想获取每个newsitem,包括该newsitem的评级数量和平均评级,以及当前用户读取newsitem的次数。
我至今是:
select newsitem.guid, supplier, count(newsrating.id) as numberofratings,
avg(newsrating.rating) as rating,
count(case usernews.UserId when 3 then 1 else null end) as numberofreads from newsitem
left join newsrating on newsitem.guid = newsrating.newsguid
left join usernews on newsitem.guid = usernews.newsguid
group by newsitem.guid
我已经在这里创造一个SQL小提琴:http://sqlfiddle.com/#!9/c8add/8
两个计数()调用不返回我想要的号码。 numberofratings应该返回评级为newsitem总数(所有用户)。 numberofreads应该为当前用户返回该新站点的读数的数量。
所以,newsitem与GUID d104c330-c319-40e8-8be3-a7c4f549d35c应该有2个等级和3读取与用户ID = 3
我曾尝试有条件数和金额的当前用户,但还没有成功。这如何实现?
以及格式化问题。但下一次我可能会建议你使用一个整数ID而不是一个GUID,这个想法是让问题更简单。此外,如果可能的话,你应该在表格格式 –
中包含你想要的输出和提供的数据,问题似乎是这两个左连接都增加了计数返回的行数(它基本上结合了加入a和加入b的选项) ,这导致了结果numberofreads和评级数量都是实际值的总和。所以我想你要么必须使用存储的数据库函数,要么使用子查询而不是左连接中的一个 –
@JuanCarlosOropeza,我意识到这些GUID会让问题变得难以阅读。在撰写问题时,从我这边来一点懒惰:)关于所需的输出:我认为这个问题已经太长了,这就是为什么我决定将实际数据保存在sql小提琴中的原因。尽管如此,可能会更清楚。 – Moolie