我有两张桌子:
programmes[id,name,..]
notes[id,note,id_prgm,..]
我实际上要求了解有关prgm和相关注释的一些信息:
SELECT p.id, p.name, ...
FROM programmes p
LEFT OUTER JOIN notes n
ON (n.id_prgm=p.id AND ...)
WHERE ...
GROUP BY p.id
ORDER BY ...
LIMIT 20
它工作得很好,但现在我想知道这个查询可以给我多少行(没有LIMIT) 所以我尝试输入一个COUNT(p.id),但它给了我每个程序的注释数。而不是全部的节目。
那么我可以编辑此查询以了解这一点?
(使用php的mysql)
答案 0 :(得分:0)
SELECT p.id, p.name, ...
FROM programmes p
LEFT OUTER JOIN notes n
ON (n.id_prgm=p.id AND ...)
WHERE ...
GROUP BY p.id WITH ROLLUP
您将获得每个程序的计数,然后是一个NULL,TOTAL COUNT行。 另外,请注意以下事项:
使用ROLLUP时,也不能使用ORDER BY子句进行排序 结果。换句话说,ROLLUP和ORDER BY是相互的 独家。但是,您仍然可以控制排序顺序。组 MySQL中的BY对结果进行排序,您可以使用显式ASC和DESC 在GROUP BY列表中命名的列的关键字,用于指定排序顺序 对于单个列。 (ROLLUP添加的更高级别的摘要行 无论如何,它仍会出现在计算它们的行之后 排序顺序。)
如果您想要显示每行中显示的总计数,请按以下方式删除该组:
SELECT p.id, p.name, COUNT(*)
FROM programmes p
LEFT OUTER JOIN notes n
ON (n.id_prgm=p.id AND ...)
WHERE ...
ORDER BY ...
如果您希望为每条记录显示计数但保留该组,请执行以下操作:
SELECT t.*, COUNT(*) FROM (
SELECT p.id, p.name, ...
FROM programmes p
LEFT OUTER JOIN notes n
ON (n.id_prgm=p.id AND ...)
WHERE ...
GROUP BY ...
ORDER BY ...
) t
子查询中不支持limit子句,但您必须找到其他内容。
我认为你想要DISTINCT,而不是GROUP BY。这不是一回事,不应混淆。有关详细信息,请参阅此问题的my answer。
答案 1 :(得分:0)
您可以创建一个查询来计算查询的行数(这将是一个子查询):
select count(*)
from (select p.id, ... from ... )
当然,您可以跳过聚合函数和group by以使子查询更快,只需在子查询中添加distinct
:
select count(*)
from (select distinct p.id, ... from ... )
希望这有助于你
答案 2 :(得分:0)
使用php
和mysql
,您可以在查询中使用SQL_CALC_FOUND_ROWS
时使用limit
,只需在查询执行后运行SELECT FOUND_ROWS()
即可返回找不到所有行
$query = 'SELECT SQL_CALC_FOUND_ROWS p.id, p.name, ...
FROM programmes p
LEFT OUTER JOIN notes n
ON (n.id_prgm=p.id AND ...)
WHERE ...
GROUP BY p.id
ORDER BY ...
LIMIT 20';
mysql_query($query);
$query = 'SELECT FOUND_ROWS()';
mysql_query($query);
答案 3 :(得分:0)
您可以让PHP为您计算行数。
我是这样做的:
$sql = "<your-query>";
$resource = mysql_query($sql);
if (! $resource = mysql_query($sql) ){
echo "Error reading from table $table";
die;
}
if (! $num = mysql_num_rows($resource ) ){
echo "No records found in $table";
}
else {
echo "$num rows found";
while($row = mysql_fetch_assoc($resource)){
//...
// other stuff you want to do
}
}
注意:我使用的是mysql_
个函数,但在mysqli_
中应该采用类似的方式。