2011-10-07 88 views
2

我有一個While循環,在每行中顯示COUNTp.songid(後軌)。我實際需要的是根據trackDeleted=0而不是所有行來計算計數。MySQL count rows where another column = value

SELECT u.username, u.id, u.score, s.genre, s.songid, s.songTitle, s.timeSubmitted, s.userid, s.insWanted, s.bounty, COUNT(p.songid) 
FROM songs s 
LEFT JOIN users u ON u.id = s.userid 
LEFT JOIN posttracks p ON s.songid = p.songid 
WHERE paid=1 AND s.timeSubmitted >= (CURDATE() - INTERVAL 60 DAY) 
GROUP BY s.timeSubmitted ASC 
LIMIT 25 

我可以更新上述查詢,還是必須在單獨的查詢中?

+0

如果是while循環?在MySQL中還是服務器端編程語言? – mellamokb

+0

WHILE循環在PHP – user978905

+0

因此,您要通過在PHP中循環並增加一個count變量來計算上述查詢中的p.songid的所有行? – mellamokb

回答

0

它取決於trackDeleted列在哪個表中。

如果它生活在posttracks,那麼它的簡單

SELECT COUNT(p.songid) FROM posttracks p where p.trackDeleted=0 
+0

我重新解釋了我的問題。我需要COUNT所有行稱爲songid在哪裏trackdeleted(這是在p.posttracks)= 0。這可能嗎? – user978905

+0

是的,試試我給你看的。 – santiagobasulto

+0

當我將它添加到我的查詢的WHERE子句時,它只會返回trackDeleted = 0的音軌。我需要它來計算所有軌道WHERE tracksDeleted = 0 – user978905

0

添加trackDeleted = 0WHERE條款:

... 
WHERE paid=1 AND s.timeSubmitted >= (CURDATE() - INTERVAL 60 DAY) 
    AND trackDeleted=0 
-- ^^^ add this 
GROUP BY s.timeSubmitted ASC 
... 
+0

我重新解釋了我的問題。我需要COUNT所有行稱爲songid在哪裏trackdeleted(這是在p.posttracks)= 0。這可能嗎? – user978905

0

嘗試...... 您必須由p.songid組。

SELECT u.username, u.id, u.score, s.genre, s.songid, s.songTitle, 
s.timeSubmitted, s.userid, s.insWanted, s.bounty, COUNT(p.songid) FROM 
songs s LEFT JOIN users u ON u.id = s.userid LEFT JOIN posttracks p ON 
s.songid = p.songid WHERE paid=1 AND s.timeSubmitted >= (CURDATE() - 
INTERVAL 60 DAY) GROUP BY s.timeSubmitted ASC,p.songid LIMIT 25 
+0

我重新表述了我的問題。我需要COUNT所有行稱爲songid在哪裏trackdeleted(這是在p.posttracks)= 0。這可能嗎? – user978905

+0

呀!只是在你的情況下添加p.trackDeleted = 0。 –

+0

當我將它添加到我的查詢的WHERE子句時,它只會返回trackDeleted = 0的曲目。我需要它計數所有軌道WHERE tracksDeleted = 0 – user978905

-1

試試這個。

DECLARE @trackCount int, 
SELECT u.username, u.id, u.score, s.genre, s.songid, s.songTitle, s.timeSubmitted, s.userid, s.insWanted, s.bounty, 
FROM songs s 
LEFT JOIN users u ON u.id = s.userid 
LEFT JOIN posttracks p ON s.songid = p.songid 
WHERE paid=1 
AND s.timeSubmitted >= (CURDATE() - INTERVAL 60 DAY) 
GROUP BY s.timeSubmitted ASC 
LIMIT 25 

SELECT COUNT(p.songid) INTO @TrackCount 
FROM posttracks p 
WHERE p.trackDeleted = 0 

嘗試將此代碼添加到您的代碼中。只需訪問本地變量@trackcount,如果您需要顯示有多少曲目trackDeleted = 0。

+0

我重新措辭我的問題。我需要COUNT所有行稱爲songid在哪裏trackdeleted(這是在p.posttracks)= 0。這可能嗎? – user978905

+0

我已經編輯了上面的答案。試試它是否適合你。 – Nathan

+1

@Nathan,你沒有聲明'@ vars',他們只是; '@trackcount = count(*)'是不正確的,它應該是'SELECT @trackcount:= count(*)FROM ....'或者'SELECT count(*)INTO @trackcount FROM ....' – Johan

0

如果您要COUNT歌曲ID,您必須通過它自己對它進行分組,嘗試這一個。

SELECT u.username, u.id, u.score, s.genre, s.songid, s.songTitle, s.timeSubmitted, s.userid, s.insWanted, s.bounty, COUNT(p.songid) 
    FROM songs s 
    LEFT JOIN users u 
    ON u.id = s.userid 
    LEFT JOIN posttracks p 
    ON s.songid = p.songid 
    WHERE paid=1 
    AND s.timeSubmitted >= (CURDATE() - INTERVAL 60 DAY) 
    AND trackDeleted=0 
    GROUP BY p.songid 
    ORDER BY s.timeSubmitted 
    LIMIT 25; 
0

要麼把你的測試中加入條件:

LEFT JOIN posttracks p 
    ON s.songid = p.songid 
    AND trackDeleted = 0 

或更改COUNT(p.songid)的款項,而不是:

SUM(CASE WHEN (p.songid IS NOT NULL AND trackDeleted = 0) THEN 1 ELSE 0 END) 
0

萬一有人絆倒這一點,像我一樣,正確答案可能類似於:

SELECT u.username, u.id, u.score, s.genre, s.songid, s.songTitle, s.timeSubmitted, s.userid, s.insWanted, s.bounty, COUNT(IF(p.trackDeleted=0, 1, NULL)) as not_deleted_count 
    FROM songs s 
    LEFT JOIN users u 
    ON u.id = s.userid 
    LEFT JOIN posttracks p 
    ON s.songid = p.songid 
    WHERE paid=1 AND s.timeSubmitted >= (CURDATE() - INTERVAL 60 DAY) 
    GROUP BY s.timeSubmitted ASC 
    LIMIT 25 

關鍵是COUNT(IF(p.trackDeleted=0, 1, NULL)) as not_deleted_count它將查看分組中的所有曲目,並只計算那些未被刪除的曲目。

在這裏的每一個其他答案都誤認爲OP只想選擇未刪除的曲目,而當他想要的是統計在每個分組內部刪除的曲目數量。

1

我不知道,如果這個工程在MySQL,但在SQL你能過濾過程中加入如下:

SELECT u.username, u.id, u.score, s.genre, s.songid, s.songTitle, s.timeSubmitted, s.userid, s.insWanted, s.bounty, COUNT(p.songid) 
FROM songs s 
LEFT JOIN users u ON u.id = s.userid 
LEFT JOIN posttracks p ON s.songid = p.songid and trackDeleted=0 
WHERE paid=1 AND s.timeSubmitted >= (CURDATE() - INTERVAL 60 DAY) 
GROUP BY s.timeSubmitted ASC 
LIMIT 25