选择所有没有孩子的实体 - 这是正确的



我的用户表中有84,000行。用户是自动创建的。因此,我认为很高兴看到有多少用户在创建后实际做了什么。我写了这个查询:

SELECT COUNT(*) FROM Users u
JOIN Folders f ON UserId = u.Id
JOIN Playlists p ON FolderId = f.Id
WHERE 0 = (SELECT COUNT(*) FROM PlaylistItems WHERE PlaylistId = p.Id) 

我的目的是仅计算其任何播放列表中没有播放列表项目的用户。此查询返回了74,000个结果,这似乎很高。

我想知道此查询是否正在选择所有具有至少一个没有项目的播放列表的用户。也就是说,如果用户有两个播放列表 - 一个空名,一个人口填充 - 它们仍在我的查询中计算吗?而且,如果是这样,我该如何修改它以仅选择只有空播放列表的用户。

如果这要困难得多,那么我可能会尝试仅用1个播放列表来计数用户。

数据库结构是:

  • 许多用户。1:1用户:文件夹,1:许多文件夹:播放列表,1:许多播放列表:playlistItems

比计算每个播放列表的模式更好,并且比较只是找到所有在任何播放列表中没有任何内容的用户。我喜欢NOT EXISTS

SELECT COUNT(u.Id)
  FROM dbo.Users AS u
  WHERE NOT EXISTS 
  (
    SELECT 1 FROM dbo.PlayLists AS pl
     INNER JOIN dbo.PlayListItems AS pli
     ON pl.id = pli.PlayListID
     INNER JOIN dbo.Folders AS f
     ON p.FolderID = f.ID
     WHERE f.UserID = u.Id
  );

旁边,在其主表中调用Id列,其他地方的其他东西似乎是一个好主意,但我发现它很令人困惑。为什么在数据模型中无处不在的folderId称为folderid?

分解查询:

SELECT u.id, COUNT(*) FROM Users u
JOIN Folders f ON UserId = u.Id
JOIN Playlists p ON FolderId = f.Id
join  PlaylistItems on PlaylistId = p.Id
group by u.id

这应该为您提供所有用户的列表以及用户ID播放列表中的行数量的数量。几种方法要走...

请计算所有不在该列表中的用户:

select count(*) from users where id not in (SELECT u.id FROM Users u
JOIN Folders f ON UserId = u.Id
JOIN Playlists p ON FolderId = f.Id
join  PlaylistItems on PlaylistId = p.Id
group by u.id)

mysql在这方面的表现不佳...使用左JOIN:

 select count(*) 
from   users u left join  (SELECT u.id, COUNT(*) FROM Users u
JOIN Folders f ON UserId = u.Id
JOIN Playlists p ON FolderId = f.Id
join  PlaylistItems on PlaylistId = p.Id
group by u.id)a 
on a.id = u.id
where a.id is null

相关内容

最新更新