0

我有两张桌子:

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

它工作得很好,但现在我想知道这个查询可以给我多少行(没有限制)所以我​​尝试输入一个 COUNT(p.id),但它给了我每个程序的注释数。而不是全部的程序。

那么谁可以编辑这个查询来知道呢?

(带有 php 的 mysql)

4

4 回答 4

0

和你可以在使用查询php时使用你只需要在你的查询执行后运行将返回所有没有找到的行mysqlSQL_CALC_FOUND_ROWSlimitSELECT 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);
于 2013-04-22T18:59:46.763 回答
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_.

于 2013-04-22T19:07:10.463 回答
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 中的 GROUP BY 对结果进行排序,您可以对 GROUP BY 列表中命名的列使用显式 ASC 和 DESC 关键字来指定各个列的排序顺序。(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 子句,您必须找到其他内容。


我认为您想要区分,而不是 GROUP BY。这不是一回事,不应混淆。有关更多信息,请参阅对此问题的回答。

于 2013-04-22T18:55:05.093 回答
0

您可以进行一个查询来计算查询的行数(这将是一个子查询):

select count(*)
from (select p.id, ... from ... )

当然,您可以跳过聚合函数和 group by 以使子查询更快,只需添加distinct您的子查询:

select count(*)
from (select distinct p.id, ... from ... )

希望这可以帮助你

于 2013-04-22T18:55:12.450 回答