我在右连接中有计数问题,使用此代码我可以计算有多少访问者有视频
SELECT video_id, COUNT(video_id) AS Views FROM fm_views GROUP BY video_id ORDER BY Views DESC;
它返回以下示例。
video_id Views
1668306 10
21041317 4
3845 2
13796095 1
16808537 1
11170454 1
这是正确的计数,现在我把例子2放错了计数
SELECT fm_video.*, IFNULL(COUNT(fm_views.video_id), 0) AS Views FROM fm_views RIGHT JOIN fm_video ON fm_video.video_id = fm_views.video_id GROUP BY fm_video.video_id ORDER BY Views DESC, id DESC;
这就是问题,现在我明白了(没有零值的简化版)
video_id Views
1668306 10
21041317 4
3845 >>4<< This is the problem
13796095 1
16808537 1
11170454 1
现在我在视频3845中得到4个视图,当我在右连接后只有2个带有video_id的条目时,剩下的值都没问题,但我认为当我在数据库中有更多条目时,我会遇到更多问题这个错误的值
我找不到像格式这样的简单查询的任何帮助。
答案 0 :(得分:1)
我发现if let data = UserDefaults.standard.data(forKey: "storage") {
storageArray = NSKeyedUnarchiver.unarchiveObject(with: data) as! [SimpleModel]
}
很难理解。 right join
似乎更自然,因为它将所有行保留在第一个表中。此外,left join
无法返回COUNT()
。所以,这是查询:
NULL
如果这会返回意外结果,则表示您的数据不正确,或者您的期望错误。
对于第一种可能性,我建议验证SELECT vd.*, COUNT(vw.video_id) AS Views
FROM fm_video vd LEFT JOIN
fm_views vw
ON vd.video_id = vw.video_id
GROUP BY vd.video_id
ORDER BY Views DESC, id DESC;
是表中的主键(或至少是唯一的)。您还可以运行此代码以查看是否存在重复项:
fm_video(video_id)
您还应检查两个表中select video_id
from fm_video
group by video_id
having count(*) > 1;
的类型是否相同。
答案 1 :(得分:0)
实际上,如果你fm_views
,你会看到一些空的WHERE
行,他们会以某种方式计算,添加SELECT fm_video.*, IFNULL(COUNT(fm_views.video_id), 0) AS Views
FROM fm_views
RIGHT JOIN
fm_video ON fm_video.video_id = fm_views.video_id
WHERE fm_views.video_id is not null
GROUP BY fm_video.video_id ORDER BY Views DESC, id DESC;
过滤器,并按如下方式重写您的查询:
WHERE fm_views.video_id is not null
你只需要过滤掉空行
public DbSet<Auctions> Auctions { get; set; }
public DbSet<Bid> Bids { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Auctions>()
.HasOne(p => p.Signup)
.WithMany(b => b.Auction);
modelBuilder.Entity<Bid>()
.HasOne(p => p.Auction)
.WithMany(b => b.bids);
base.OnModelCreating(modelBuilder);
}
如果连接的表具有不同的行号,则会发生这种情况 这就是为什么你有2行正确计数的原因
**如果您觉得有帮助,请投票并标记为已接受的答案**