MySQL-在同一个表中计数
我有下表:MySQL-在同一个表中计数,mysql,sql,select,count,sum,Mysql,Sql,Select,Count,Sum,我有下表: +----+---------------------+---------------+ | id | created_at | deklaracja_id | +----+---------------------+---------------+ | 1 | 2015-01-09 12:14:00 | 1 |/*deklaracja*/ | 2 | 2015-02-09 12:14:00 | 1 |/*kore
+----+---------------------+---------------+
| id | created_at | deklaracja_id |
+----+---------------------+---------------+
| 1 | 2015-01-09 12:14:00 | 1 |/*deklaracja*/
| 2 | 2015-02-09 12:14:00 | 1 |/*korekta for 1*/
| 3 | 2015-03-09 12:14:00 | 3 |/*deklaracja/
| 4 | 2015-01-09 12:14:00 | 3 |/*korekta for 3*/
| 5 | 2015-10-09 12:14:00 | 3 |/*korekta for 3*/
| 6 | 2015-10-09 12:14:00 | 6 |/*deklaracja*/
+----+---------------------+---------------+
条件:
id=deklaracja_id为deklaracja
身份证号码:deklaracja_身份证号码:korekta
我需要一个查询来显示2015-01-09之前的所有deklaracja和korekty计数
Ex.
+----+---------------------+---------------+
| id | created_at | korekty_count |
+----+---------------------+---------------+
| 1 | 2015-01-09 12:14:00 | 1 |
| 3 | 2015-03-09 12:14:00 | 2 |
| 6 | 2015-10-09 12:14:00 | 0 |
+----+---------------------+---------------+
我试过这样的方法:
SELECT *,
SUM(CASE WHEN (id <> deklaracja_id)THEN 1 ELSE 0 END )
AS korekty_count
FROM Deklaracja
WHERE created >= '2015-09-01 00:00:00'
但它不起作用,现在我完全被卡住了://在查询中添加一个GROUPBY子句
SELECT *,
SUM(CASE WHEN (id <> deklaracja_id)THEN 1 ELSE 0 END )
AS korekty_count
FROM Deklaracja
WHERE created_at >= '2015-01-09 00:00:00' GROUP BY deklaracja_id
大概是这样的:
select id, created_at,
( select count(*) from deklaracja dt
where dt.deklaracja_id <> dt.id
and dt.deklaracja_id = d.deklaracja_id
and dt.created_at >= '2015-09-01 00:00:00' ) as korekty_count
from deklaracja d
where id = deklaracja_id
在分组之前,我将使用子查询获取您感兴趣的记录:
SELECT
id,
created_at,
COUNT(deklaracja_id) AS korekty_count
FROM (
SELECT id, deklaracja_id, created_at
FROM Deklaracja
WHERE created_at >= '2015-09-01 00:00:00'
AND id <> deklaracja_id
) tmp
GROUP BY id;
您可以使用相关子查询:
SELECT id, created_at,
(SELECT COUNT(*)
FROM Deklaracja AS t2
WHERE t1.id = t2.deklaracja_id AND
t2.id <> t2.deklaracja_id) AS AS korekty_count
FROM Deklaracja AS t1
WHERE id = deklaracja_id
答案是好的。但是,如果希望在没有子查询的情况下获得与在查询中尝试的相同的结果,请使用联接尝试此查询:
SELECT t1.id, t1.created_at, COUNT(t2.id) AS korekty_count
FROM Deklaracja AS t1
LEFT JOIN Deklaracja AS t2 ON t1.id = t2.deklaracja_id
AND t2.id <> t2.deklaracja_id
WHERE t1.id = t1.deklaracja_id
AND t1.created_at >= '2015-09-01 00:00:00'
GROUP BY t1.id
这里有一个我认为这不太管用。将日期条件移动到案例测试中。根据他所说的预期结果,我成功地从该查询中获得了该结果。声明的条件是显示2015-01-09之后的所有deklaracja和korekty计数。我认为这意味着在2015年1月9日之前向所有德克拉拉贾人展示他们的科雷克蒂。如果OP的意思是显示2015-01-09之后的所有deklaracja及其korekty计数,那么您是正确的。您使用的是一个MySQL扩展来分组,允许在SELECT子句中显示非聚合字段。在您的案例中创建的这些非聚合字段(即id)的值为。因此,您查询的结果是不确定的。我所做的只是查看问题中提供的his输出示例,他说他想要记录1、3和6及其korekty计数。根据他的模型,只有一条记录的id=deklaracja_id,其余的是给定id的korekty。通过按deklaracja_id分组,我只取id=dekaracja_id的记录。为什么要对id求和而不是计数?这就是我根据他给出的查询推断出OP想要的结果,但我认为你是对的——我应该数数。我不知道表名是什么意思,所以很难说这在上下文中是否有意义。因为列id等于这些记录中的列deklaracja_id。您假设只有一个非korekty。我们不知道这是否有效。为什么要使用子查询而不是直接进行相等比较?需要添加日期条件。
SELECT t1.id, t1.created_at, COUNT(t2.id) AS korekty_count
FROM Deklaracja AS t1
LEFT JOIN Deklaracja AS t2 ON t1.id = t2.deklaracja_id
AND t2.id <> t2.deklaracja_id
WHERE t1.id = t1.deklaracja_id
AND t1.created_at >= '2015-09-01 00:00:00'
GROUP BY t1.id