[英]MySQL count rows where another column = value
I have a While
loop that displays the COUNT
of p.songid
(post tracks) in each row. 我有一个
While
循环,在每行中显示p.songid
(发布曲目)的COUNT
。 What I actually need is to get the count based on trackDeleted=0
instead of all the rows. 我真正需要的是基于
trackDeleted=0
而不是所有行进行计数。
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
Can I update the above query or does this have to be in a separate query? 我可以更新上面的查询,还是必须在单独的查询中?
I am not sure if this works in mySql but in SQL you are able to filter during the join as follows: 我不确定这是否适用于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
Just in case anyone stumbles on this, as I did, the correct answer is probably something like: 以防万一有人像我那样迷失了,正确的答案可能是这样的:
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
The key being COUNT(IF(p.trackDeleted=0, 1, NULL)) as not_deleted_count
which will look at all the tracks in a grouping, and only count those that are not deleted. 密钥是
COUNT(IF(p.trackDeleted=0, 1, NULL)) as not_deleted_count
,它将查看分组中的所有轨道,并且仅统计未删除的轨道。
Every other answer in here was mistaking the OP as only wanting to select tracks that werent deleted, when what he wanted was to count the number of tracks that werent deleted inside each grouping. 在这里,其他所有答案都是将OP误认为仅希望选择未删除的曲目,而他想要的是计算每个分组中未删除的曲目的数量。
It depends in what table the trackDeleted column is. 它取决于trackDeleted列在哪个表中。
If it lives in posttracks, then it's simple 如果它存在于后轨中,那么很简单
SELECT COUNT(p.songid) FROM posttracks p where p.trackDeleted=0
Add trackDeleted = 0
to your WHERE
clause: 将
trackDeleted = 0
添加到您的WHERE
子句中:
...
WHERE paid=1 AND s.timeSubmitted >= ( CURDATE() - INTERVAL 60 DAY )
AND trackDeleted=0
-- ^^^ add this
GROUP BY s.timeSubmitted ASC
...
Try this... You must group by the p.songid. 试试这个...您必须按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
If you are going to COUNT the song id, you must group it by it self, try this one. 如果您要对歌曲ID进行计数,则必须自行对其进行分组,请尝试使用此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;
Either put your test in the join condition: 将您的测试置于联接条件中:
LEFT JOIN posttracks p
ON s.songid = p.songid
AND trackDeleted = 0
Or change COUNT(p.songid)
to a SUM instead: 或将
COUNT(p.songid)
更改为SUM:
SUM(CASE WHEN (p.songid IS NOT NULL AND trackDeleted = 0) THEN 1 ELSE 0 END)
try this. 尝试这个。
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
try to add this to your code. 尝试将其添加到您的代码中。 just access local variable @trackcount if you need to show how many tracks have trackDeleted = 0.
如果需要显示有多少轨道的trackDeleted = 0,只需访问局部变量@trackcount。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.