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;