我陷入两难境地。
我们假设(为简单起见)我有四个表,列数和行数不同,它们是:用户,邮件,事件和服务。
当我收到请求时,我有一个ID链接其中的三个表,但它们匹配的列不同。 比方说,用户匹配user_id,邮件匹配 user_ref ,事件匹配user_ref。
即使是单个,多个甚至所有ID,这对我来说都是一个很好的查询。 问题出现在我必须采取的下一步上,那就是 * service 表。
服务表不符合其他服务表的标准,因此它没有可以提取的user_id或user_ref。 相反,它是一个* mail_ref *列,它有可能包含重复项。 我当前的方法是尝试使用IN()方法,但它只适用于选择单个用户/行。
这是我当前的查询:
SELECT
u.Name as Name,
COUNT(m.user_ref) AS Mail_total,
e.mail_id,
COUNT(e.user_ref) AS Event_total,
COUNT(s.mail_ref) AS service_total
FROM
users u
LEFT JOIN
mail m ON m.user_ref = u.user_id
LEFT JOIN
service s ON s.mail_ref IN(e.mail_id)
LEFT JOIN
events e ON e.user_ref = u.user_id
WHERE u.user_id IN(my,list,of,ids)
GROUP BY s.mail_ref
我目前遇到的问题是,虽然它正在选择正确的数据,但它并没有为我指定的每个id选择唯一数据。 当给定单个id时,它的工作量很小,但如上所述,不是在必须检索多行时。
如果有人能帮助我,我将不胜感激。
答案 0 :(得分:1)
在左连接中执行子查询以进行维护。而不是:
LEFT JOIN service s ON s.mail_ref IN(e.mail_id)
尝试
LEFT JOIN (从服务器中选择TOP 1 mail_ref)作为s on s.mail_ref = e.mail_id
上的S.看看是否有效。
答案 1 :(得分:0)
SELECT
u.Name as Name,
(select count(*) from mail m where m.user_ref = u.user_id) AS Mail_total,
e.mail_id,
(select count(*) from events e where e.user_ref = u.user_id) AS Event_total,
(select count(*) from
events e
inner join services s on s.mail_ref = e.mail_id
where
e.user_ref = u.user_id) as service_total
FROM
users u
WHERE u.user_id IN(my,list,of,ids)