Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-在同一个表中计数_Mysql_Sql_Select_Count_Sum - Fatal编程技术网

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