简体   繁体   English

MySQL计算另一列=值的行

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM