从多个表中选择数据,其中特定表不包含任何可识别的列?

时间:2012-03-24 07:03:01

标签: mysql

我陷入两难境地。

我们假设(为简单起见)我有四个表,列数和行数不同,它们是:用户邮件事件服务

当我收到请求时,我有一个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时,它的工作量很小,但如上所述,不是在必须检索多行时。

如果有人能帮助我,我将不胜感激。

2 个答案:

答案 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)