COUNT在SQL中的联接查询中输出行

时间:2013-04-22 18:48:03

标签: mysql join count

我有两张桌子:

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)

4 个答案:

答案 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)

使用phpmysql,您可以在查询中使用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_中应该采用类似的方式。