带右连接的mysql计数返回一些错误的值

时间:2016-08-20 12:11:43

标签: mysql join

我在右连接中有计数问题,使用此代码我可以计算有多少访问者有视频

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的条目时,剩下的值都没问题,但我认为当我在数据库中有更多条目时,我会遇到更多问题这个错误的值

我找不到像格式这样的简单查询的任何帮助。

2 个答案:

答案 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行正确计数的原因

**如果您觉得有帮助,请投票并标记为已接受的答案**