MySQL查询:内部加入,计数&通过...分组

时间:2017-11-06 05:05:58

标签: mysql sql

我有以下查询来获取每个formId的条目数:

SELECT DISTINCT
       formId,
       COUNT(entryID)
FROM approvalDetails
GROUP BY formId;

我想扩展此查询以从另一个表中拉出与formId关联的userEmail(表#2称为首选项)

我尝试过以下操作,但计数值看起来不正确。

SELECT approvalDetails.formId,
       COUNT(approvalDetails.entryID),
       preferences.userEmail
FROM approvalDetails
     INNER JOIN preferences ON approvalDetails.formId = preferences.formId
GROUP BY approvalDetails.formId,
         preferences.userEmail;

示例数据

表1 - approvalDetails

formId    entryId
-         -
1         1
1         2
1         3
2         4
3         5

表2 - 首选项(电子邮件地址不是formId独有的)

formId    userEmail
-         -
1         email1
2         email2
3         email3
3         email4
3         email4

需要输出

  formId    Count (entryID)  userEmail
    -         -              -
    1         3              email1
    2         1              email2
    3         1              email3
    3         1              email4

3 个答案:

答案 0 :(得分:1)

SELECT ap.formId,
       ap.entryID,
       preferences.userEmail
FROM
(
    SELECT formId,
           COUNT(entryID) entryID
    FROM approvalDetails
    GROUP BY formId
) ap
INNER JOIN preferences ON ap.formId = preferences.formId
GROUP BY ap.formId,
         preferences.userEmail;

答案 1 :(得分:0)

当您使用实际变为等于加入的内部联接时。 Equi join与来自参与join的所有表的匹配行相交。 所以它将形成虚拟表,根据连接将具有行公共, 因此,如果第一个表有10行而另一个表有5行。但是如果连接条件匹配4行,那么生成的虚拟表只有4行。

所以我认为你的计数聚合列只显示匹配的行。

请根据您的要求使用适当的左外连接或右外连接。

答案 2 :(得分:0)

您可以从派生表格中的表格distinct中选择formId emailIdpreferences,然后将其加入表approval_Details,如下所示。

SELECT t1.formId,
       count(EntryId) as EntryIdCount,
       t2.userEmail
FROM approvalDetails t1
JOIN
  (SELECT DISTINCT formId,
                   userEmail
   FROM preferences) t2 ON t1.formId = t2.formId
GROUP BY t1.formId,
         t2.userEmail

<强>结果:

formId  EntryIdCount    userEmail
---------------------------------
1       3               email1
2       1               email2
3       1               email3
3       1               email4

<强> DEMO