[英]MySQL COUNT records before GROUP BY
我正在对两个表进行简单的查询,并且试图计算如果不对它们进行分组,则具有相同ID的记录数。 这些是表格:
id-类型-user_id-field_id
1-绘画-53-12
2-阅读-53-12
3-写作-53-12
id-is_test-user_id-field_id
7-是-53-12
8-否-53-12
通过此查询,我从表jobs
(绘画)中获得了我想要的单条记录,因为我在jobs.id
列上使用了GROUP BY
子句。 如果我不使用GROUP BY,我将获得2条记录,因为对于同一user_id
和field_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
实际匹配记录数的列。 基本上我想在具有相同user_id
和field_id
activities
获得2作为记录数。
我试图选择像这样的新列:
SELECT `jobs`.*,`activities`.`is_test`, COUNT(DISTINCT `jobs`.`id`) AS `tot_act`
但这显然为新列tot_act
返回1而不是2。 让它计算现场activities.is_test
.is_test也不起作用。
我试图避免进行子选择 。
请不要关注activities.is_test
列,我不在乎是否将其设置为Yes或No,我只想计算是否存在与Yes匹配的记录,而对于No则有一个记录,因此总共有2条记录我不分组。 2是我尝试作为新列检索的值 。
任何想法将不胜感激!
您的第一个查询没有任何意义。 “分组依据”仅在输出列(选择子句)中与集合函数结合使用。
activity.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;
COUNT()对于遇到的每个NON NULL值都增加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。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.