MySQL GROUP BY 之前有 COUNT 条记录
MySQL COUNT records before GROUP BY
我正在对两个 table 进行一个简单的查询,并且我正在尝试计算如果我不对它们进行分组会得到的具有相同 ID 的记录的数量。
这些是 tables:
TABLE 职位
id -- 类型 -- 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
通过此查询,我从 table jobs
(绘画)中获得了我想要的单个记录,因为我在 [=15= 列上使用了 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;
我想做的是获取另一列,其中包含 table activities
中匹配记录的实际数量。基本上我想得到 2 作为 activities
中具有相同 user_id
和 field_id
.
的记录数
我试过 select 新专栏是这样的:
SELECT `jobs`.*,`activities`.`is_test`, COUNT(DISTINCT `jobs`.`id`) AS `tot_act`
但这显然是 returns 1 而不是新列 tot_act
的 2。让它计算字段 activities.is_test
也不起作用。
我试图避免子select。
请不要关注activities.is_test
栏目,我不关心设置为Yes或No,我只想统计有一条匹配的记录为Yes,一条为如果我不对它们进行分组,那么总共不会有 2 条记录。 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
您的第一个查询没有任何意义。 Group by 只有在输出列(select 子句)中结合聚合函数才有意义。
activities.field_id 上的 where 过滤器正在(昂贵地)将左连接转换为内连接。
我还怀疑你的模式没有规范化。
to fetch another column containing the actual number of matching records in the table activities
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。
在您的情况下,您需要活动 table 的行数,而不是工作 table。
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 和分组子句中包含 activity.is_test,那么您将不会得到 2 的计数。
我正在对两个 table 进行一个简单的查询,并且我正在尝试计算如果我不对它们进行分组会得到的具有相同 ID 的记录的数量。 这些是 tables:
TABLE 职位
id -- 类型 -- 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
通过此查询,我从 table jobs
(绘画)中获得了我想要的单个记录,因为我在 [=15= 列上使用了 GROUP BY
子句].如果我不使用 GROUP BY,我会得到 2 条记录,因为相同的 user_id
和 field_id
.
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;
我想做的是获取另一列,其中包含 table activities
中匹配记录的实际数量。基本上我想得到 2 作为 activities
中具有相同 user_id
和 field_id
.
我试过 select 新专栏是这样的:
SELECT `jobs`.*,`activities`.`is_test`, COUNT(DISTINCT `jobs`.`id`) AS `tot_act`
但这显然是 returns 1 而不是新列 tot_act
的 2。让它计算字段 activities.is_test
也不起作用。
我试图避免子select。
请不要关注activities.is_test
栏目,我不关心设置为Yes或No,我只想统计有一条匹配的记录为Yes,一条为如果我不对它们进行分组,那么总共不会有 2 条记录。 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
您的第一个查询没有任何意义。 Group by 只有在输出列(select 子句)中结合聚合函数才有意义。
activities.field_id 上的 where 过滤器正在(昂贵地)将左连接转换为内连接。
我还怀疑你的模式没有规范化。
to fetch another column containing the actual number of matching records in the table activities
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。
在您的情况下,您需要活动 table 的行数,而不是工作 table。
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 和分组子句中包含 activity.is_test,那么您将不会得到 2 的计数。