2015-10-13 76 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