2015-10-13 75 views
0

我有如下表:MySQL的 - 算在同一个表

+----+---------------------+---------------+ 
| 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” ID <> deklaracja_id是 “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' 

,但它不工作,现在我完全卡住:/

+1

为什么“1,3,和6'? – Strawberry

+1

@Strawberry,因为列ID'等于'这些记录的列deklaracja_id。 –

回答

1

添加GROUP BY子句查询。

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 
+1

我不认为这很有效。在CASE测试中移动日期条件。 –

+0

根据他所期望的结果,我设法从这个查询中得到结果。 –

+0

规定的条件是“显示所有”deklaracja“和他们的”korekty“比2015-01-09晚。”我认为这意味着显示(所有的deklaracja)与(他们的korekty计数比2015-01-09晚)。如果OP的意思是显示所有(deklaracja晚于2015-01-09)与(他们的korekty的计数),那么你是正确的。 –

0

事情是这样的:

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 
0

我会用一个子查询分组之前得到你感兴趣的记录:

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; 

See demo.

+0

你为什么总结这些ID而不是数它们? –

+0

这就是我根据他给出的查询推断OP的要求,但我认为你是对的 - 我应该算数。我不知道表名是什么意思,所以很难说如果这在上下文中是有意义的。 – woz

1

您可以使用相关的子查询:

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 

Demo here

+0

需要添加日期条件。 –

0
SELECT created_at, count(*)-1 
from Deklaracje d 
where id in (select id from Deklaracje e 
      where e.deklaracja_id=d.deklaracja_id) 
group by deklaracja_id 

SQL Fiddle link

+0

你假设只有一个非korekty。我们不知道这是否有效。为什么使用子查询而不是直接进行相等比较? –

0

答案由Giorgos Betsos是一个很好的一个。但是,如果要实现无子查询像你在查询中尝试了同样的结果,然后使用试试这个联接:

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 

这里是一个fiddle