Mysql 查询中的计数和不同结果

Mysql 查询中的计数和不同结果,mysql,Mysql,我的数据库中有此查询和结果: mysql> SELECT id FROM jos_content WHERE catid=12 AND state=1 AND DATE(publish_up) <= NOW() ORDER BY DATE(publish_up) DESC LIMIT 0,5; mysql>从jos\u内容中选择id 其中catid=12,state=1 和日期(publish\u up)从jos\u内容中选择count(*)、id

我的数据库中有此查询和结果:

mysql> SELECT id FROM jos_content 
       WHERE catid=12 AND state=1 
       AND DATE(publish_up) <= NOW() ORDER BY DATE(publish_up) DESC LIMIT 0,5;
mysql>从jos\u内容中选择id
其中catid=12,state=1
和日期(publish\u up)从jos\u内容中选择count(*)、id
其中catid=12,state=1

和日期(publish_up)您需要包含一个
GROUP BY
子句。默认情况下,MySQL允许
SELECT
子句中的列也不包括在
groupby
中(这在大多数其他RDBMS中是一个错误)。如果没有分组依据,MySQL将返回第一个相关列,这通常不是正确的预期结果

SELECT 
  count(*), 
  id
FROM jos_content
WHERE catid=12 AND state=1 AND DATE(publish_up) <= NOW() 
GROUP BY id
ORDER BY DATE(publish_up) DESC
LIMIT 0,5;
为了与其他RDBMS兼容,并避免bug,我建议始终明确地将所有
SELECT
列包含在
groupby

更新 为了更好地理解您所尝试的内容,如果您需要每行id旁边的所有行的总数,您可以在
SELECT
列表中使用类似的子选择。不过这会有点慢

SELECT
  id,
  (SELECT COUNT(*) FROM jos_content) AS numitems
FROM jos_content
WHERE catid=12 AND state=1 AND DATE(publish_up) <= NOW() 
ORDER BY DATE(publish_up) DESC
LIMIT 0,5;

Count是聚合函数,因此如果您想包含任何列,那么该列必须是查询中group by子句的一部分。

我不知道MySQL允许这样做,并且默默地做了“奇怪的事情”-一定很幸运,我以前没有被它咬过+我只是为了提醒你!您好,我刚刚意识到它不起作用,它在count(*)值中始终显示1,我需要3。@user1256477所以您想要每个id旁边所有行的总计数,而不是该id的计数?是的,我想我应该在两个查询中完成@user1256477查看我在上面添加的内容。这些将解决问题。它将只返回一条记录,因此不可能显示id列的所有值。@Michael,是的,使用变通方法是可能的。我已经提到了select语句中count(*)情况下Group by的工作方式。 +----------+----+ | count(*) | id | +----------+----+ | 3 | 46 | +----------+----+ 1 row in set (0.00 sec)
SELECT 
  count(*), 
  id
FROM jos_content
WHERE catid=12 AND state=1 AND DATE(publish_up) <= NOW() 
GROUP BY id
ORDER BY DATE(publish_up) DESC
LIMIT 0,5;
SELECT 
  id,
  name,
  COUNT(*)
FROM tbl
GROUP BY id
SELECT
  id,
  (SELECT COUNT(*) FROM jos_content) AS numitems
FROM jos_content
WHERE catid=12 AND state=1 AND DATE(publish_up) <= NOW() 
ORDER BY DATE(publish_up) DESC
LIMIT 0,5;
SELECT
  id
  numitems
FROM 
  jos_content
  /* Join with no ON clause */
  JOIN (SELECT COUNT(*) AS numitems FROM jos_content) subq
WHERE catid=12 AND state=1 AND DATE(publish_up) <= NOW() 
ORDER BY DATE(publish_up) DESC
LIMIT 0,5;