【发布时间】:2016-04-03 23:18:36
【问题描述】:
我正在对两个表进行一个简单的查询,并且我正在尝试计算如果我没有对它们进行分组,我会得到的具有相同 ID 的记录的数量。 这些是表格:
表格作业
id -- type -- 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 中匹配记录的实际数量。基本上我想在activities 中使用相同的user_id 和field_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 是我尝试检索的值作为新列。
任何想法将不胜感激!
【问题讨论】:
-
你能澄清一下你想要做什么吗?这里有很多信息,我认为您的请求被困在所有信息的中间。
-
首先,不要使用
select jobs.*和group by。 MySQL 可能允许您选择不属于聚合或分组依据的列,但其他人很少这样做。此外,您说您在第一个查询中获得 1 条记录,因为您在jobs.id上进行分组。根据您的示例数据,我看不出这是怎么可能的,因为您正在选择具有 2 个不同 id 的 2 行 -
对不起,我会尽量澄清。鉴于我正在使用的查询,我想检索 ID 为 1 的表
jobs的所有记录,因为类型是painting。然后我想要activities表中的两个匹配列之一is_test,因为我不在乎它是哪条记录,只要user_id和field_id匹配。最后我想得到一个计数列为 2,因为 2 是表activities中的匹配记录。感谢您的帮助。 -
您能否澄清您对
is_test专栏的陈述。是否要显示一个显示为yes或no的列并且您不在乎它是哪一列? -
@Lock:谢谢,我不在乎
is_test这列是Yes还是No,我只想知道有2条记录。很快就会尝试您的解决方案。再次感谢
标签: mysql select count group-by distinct