GROUP BY

时间:2015-12-30 01:43:14

标签: mysql select count group-by distinct

我正在对两个表进行简单查询,并且我正在尝试计算具有相同ID的记录数,如果我没有将它们分组的话。 这些是表格:

TABLE作业

id - type - user_id - field_id

1 - 绘画--53 - 12

2 - 阅读 - 53 - 12

3 - 写作 - 53 - 12

TABLE活动

id - is_test - user_id - field_id

7 - 是 - 53 - 12

8 - 否 - 53 - 12

使用此查询,我从表jobs(绘图)中获取了我想要的单个记录,因为我在列GROUP BY上使用了jobs.id子句。如果我没有使用GROUP BY,我会得到2条记录,因为同一user_idfield_id有2项匹配活动。

SELECT `jobs`.*,`activities`.`is_test` 
FROM `jobs` 
LEFT JOIN `activities` ON `activities`.`user_id`=`jobs`.`user_id` 
WHERE `jobs`.`field_id`=12 AND `activities`.`field_id`=12 AND `jobs`.`type`='painting' AND `jobs`.`user_id`=53 
GROUP BY `jobs`.`id` 
ORDER BY `jobs`.`id` DESC;

我要做的是获取包含表activities中实际匹配记录数的另一列。基本上我想在activities中使用相同的user_idfield_id获得2个记录数。

我试图像这样选择新列:

SELECT `jobs`.*,`activities`.`is_test`, COUNT(DISTINCT `jobs`.`id`) AS `tot_act` 

但是对于新列tot_act,这显然会返回1而不是2。将其计为字段activities.is_test也不起作用。

试图避免子选择

请不要注意activities.is_test栏,我不在乎看是否设置为是或否,我只想计算是否有匹配的记录为是和一个为否如此如果我不对它们进行分组,则总共有2条记录。 2是我正在尝试检索的值作为新列。

任何想法都将不胜感激!

3 个答案:

答案 0 :(得分:1)

您的第一个查询没有任何意义。 Group by只与输出列中的聚合函数相结合(select子句)。

activities.field_id上的where过滤器(昂贵地)将左连接转换为内连接。

我还怀疑你的架构没有规范化。

  

获取包含表活动中实际匹配记录数的另一列

SELECT `jobs`.id, jobs.type, jobs.user_id, 
  Jobs.field_id,`activities`.`is_test`, 
  SUM(IF(activities.id IS NULL, 0,1)) 
FROM `jobs` 
 LEFT JOIN `activities` 
 ON `activities`.`user_id`=`jobs`.`user_id` 
 AND activities.field_id=12
WHERE `jobs`.`field_id`=12 
 AND `jobs`.`type`='painting' 
 AND `jobs`.`user_id`=53 
GROUP BY `jobs`.id, jobs.type, jobs.user_id, 
  Jobs.field_id,`activities`.`is_test`
ORDER BY `jobs`.`id` DESC;

答案 1 :(得分:1)

对于遇到的每个NON NULL值,COUNT()递增1。

在您的情况下,您需要活动表中的行数,而不是作业表。

SELECT
      jobs.id
    , jobs.type
    , jobs.user_id
    , Jobs.field_id
    , COUNT(activities.id) activity_count
FROM jobs
      LEFT JOIN activities ON jobs.user_id = activities.user_id
                  AND activities.field_id = 12
WHERE jobs.field_id = 12
      AND jobs.type = 'painting'
      AND jobs.user_id = 53
GROUP BY
      jobs.id
    , jobs.type
    , jobs.user_id
    , Jobs.field_id
ORDER BY
      jobs.id DESC;

来自查询产生此结果的示例数据:

| id |     type | user_id | field_id | activity_count |
|----|----------|---------|----------|----------------|
|  1 | painting |      53 |       12 |              2 |

但请注意,如果在select和grouping子句中包含activity.is_test,则不会得到2的计数。

请参阅this sqlfiddle

答案 2 :(得分:0)

SELECT
  `jobs`.id,
  `jobs`.type,
  `jobs`.user_id,
  `jobs`.field_id,
  count(1) as activities_count,
  max(`activities`.is_test) as is_test
FROM
  `jobs`
LEFT OUTER JOIN
  `activities` ON
  `activities`.user_id = `jobs`.user_id
  AND `activities`.field_id = `jobs`.field_id
WHERE
  `jobs`.field_id = 12
  AND `jobs`.type = 'painting'
  AND `jobs`.user_id = 53
GROUP BY
  `jobs`.id,
  `jobs`.type,
  `jobs`.user_id,
  `jobs`.field_id