【问题标题】:Select with count on 3 tables在 3 个表上选择计数
【发布时间】:2017-11-30 08:46:12
【问题描述】:

对于 3 张桌子上的特定 SELECT,我需要您的帮助。我对SQL 不熟练,所以对我来说这是一个困难的SELECT,因为我必须将COUNT(我想)应用于查询。

我给你看我的桌子:

我需要知道数据库中有多少联系人(所有联系人!!!!)以及有多少照片视频 绑定到任何联系人。

我应该得到类似这样的结果:

-----------------------------------
| ID | NAME       | PHOTO | VIDEO |
-----------------------------------
| 1  | MARK       | 3     | 1     |
-----------------------------------
| ID | LISA       | 2     | 0     |
-----------------------------------

感谢您的帮助

【问题讨论】:

  • 你试过什么?向我们展示您当前的查询尝试。

标签: sql select join count


【解决方案1】:

您可以使用以下方法,如果您对查询中的重复项犹豫不决,您可以使用 sql 函数并将类型参数作为字符串传递。如果您的类型数量不确定(VIDEO、PHOTO、TEXT 等),您需要重新设计输出表格式(我会使用以下元组 TYPE、CONTACT_ID、COUNT),或者在最坏的情况下使用动态查询构造。

select c.ID, c.NAME, 
(select count(*) from CONTACT_MEDIA cm join MEDIA m on 
m.ID = cm.ID_MEDIA and m.TYPE = 'PHOTO' where cm.ID_CONTACT = c.ID) as PHOTO, 
(select count(*) from CONTACT_MEDIA cm join MEDIA m on 
m.ID = cm.ID_MEDIA and m.TYPE = 'VIDEO' where cm.ID_CONTACT = c.ID) as VIDEO
from CONTACT c

【讨论】:

  • Np。我不会再次编辑我的答案。但我想评论动态方法。在这种情况下,您需要找到所有唯一类型,然后对它们进行迭代,以字符串形式向查询添加新的输出 col 定义,之后您可以使用“sp_executesql”运行构造查询。它会起作用,但从客户的角度来看,它效率不高且难以使用。但如果你别无选择,那么这是一条可行的路。
【解决方案2】:

请使用下面的查询,这将为您提供准确的结果

select contact_media.ID_Contact, contact.Name, count(M1.ID) as 'PHOTO', COUNT(M2.ID) as 'VIDEO' from Contact inner join contact_media on Contact.ID=contact_media.ID_Contact
left outer join media M1 on contact_media.ID_Media=M1.ID and M1.TYPE='PHOTO'
left outer join media M2 on contact_media.ID_Media=M2.ID and M2.TYPE='VIDEO'
 group by contact_media.ID_Contact, contact.Name

【讨论】:

  • 感谢您的帮助。我试过你的查询,但有问题。如果联系人没有照片/视频,则不会从数据库中“获取”。我需要数据库上的所有联系人。我应该编辑您的查询以获取所有联系人吗?
猜你喜欢
  • 2016-12-08
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
相关资源
最近更新 更多