重构多个表上的连接

时间:2017-12-21 15:26:18

标签: mysql sql

我遇到了查询我的问题以及它是如何加入的问题。我需要从CSR表中提取一些数据以及与之关联的经销商数量。

如下图所示,我需要为每个用户以及与该号码相关的许多经销商返回一些日常联系记录。最终我需要使用由这1个值组成的公式,但我可以毫无问题地执行此操作我只是在适当地获取这两个值时遇到问题。

目前,我在两个计数值上都得到相同的数字,它们应该是不同的。

代码:

    SELECT 
          c.user AS UserID,
        COUNT(*) AS NumberOfDailyContacts, -- number of records in contact_events for this user
        COUNT(d.csr) AS NumberOfDealerContacts, -- number of dealers associated with this user
      FROM contact_events c
        JOIN users u
          ON c.user = u.id
        JOIN dealers d
          ON c.dealer_num = d.dealer_num
        LEFT JOIN attr_list al
          ON d.csr = al.data
      GROUP BY UserID;

小提琴: http://sqlfiddle.com/#!9/bd375/1

期望的输出:

      12345 |  2 |  3
      23456 |  2 |  6
      34567 |  2 |  2
      45678 |  2 |  2
      56789 |  2 |  5
      67890 |  2 |  2
      78911 |  2 |  4

但目前这个小提琴给了我两个专栏的全部2个。

这些表的表结构很糟糕,但这是我目前给出的。问题是联系事件表使用CSR的用户ID,其中经销商表通过attribute_list表上的'data'值关联。所以我基本上要说:

  

如果contact_events表格中的用户ID与user_id中给定data字段的attr_list匹配,则显示与该用户相关联的经销商。

希望小提琴让这一点更清晰,但我会回答你的任何问题。

2 个答案:

答案 0 :(得分:2)

使用将attr_list加入dealers的子查询来获取每位用户的经销商数量。

select 
    c.user as UserID,
    count(*) as NumberOfDailyContacts,
    al.NumberOfDealerContacts
From contact_events c
join users u
on c.user = u.id
join dealers d
on c.dealer_num = d.dealer_num
left join (
  SELECT user_id, COUNT(*) AS NumberOfDealerContacts
  FROM attr_list AS al
  JOIN dealers AS d ON d.csr = al.data
  GROUP BY user_id) AS al
ON al.user_id = c.user
GROUP BY UserID

fiddle

答案 1 :(得分:0)

你的联接失灵了,这导致你的计数搞砸了。这是它应该是什么,不需要子查询:

SELECT
    u.id                          AS UserID
    ,COUNT(DISTINCT c.id)         AS NumberOfDailyContacts
    ,COUNT(DISTINCT d.dealer_num) AS NumberOfDealerContacts
FROM users               u
LEFT JOIN attr_list      al ON u.id = al.user_id
LEFT JOIN dealers        d ON d.csr = al.data
LEFT JOIN contact_events c ON c.user = u.id
GROUP BY u.id;