按行数计算结果

时间:2011-03-20 11:45:55

标签: php mysql list sql-order-by

我正在尝试创建一个函数,它会显示我设置的行 Y 的顶部 X 结果,对于此实例,我正在使用行<来自我的表统计信息的强>浏览器和最高 5 结果,这就是消除搜索机器人结果显示的原因。我也希望它返回行数的计数。所以说浏览器'Safari'有10个结果,那么它将返回该结果的10个数以及结果本身。

$display->show_list('statistics', 'browser', '5', 'WHERE browser!=\'Search Bot\'');

这是我的功能。如果查询失败,我会清理一下以删除某些检查和输出等等。

function show_list($table, $row, $limit = 5, $where = NULL) {

$item = mysql_query("SELECT DISTINCT $row FROM $table $where LIMIT $limit");

            $result = array();

while ($fetch = mysql_fetch_array($item)) {

            $result[] = $fetch;
}
            return $result;
}

3 个答案:

答案 0 :(得分:2)

我不确定我是否理解这个问题,但在SQL查询中使用group by子句呢:

select your_column, count(*)
from your_table
where ...
group by your_column
order by count(*) desc
limit 5

那会得到你:

  • 代表your_column
  • 的每个值
  • 具有该值的行数
  • 并且您将保留your_column具有最大行数
  • 的5个值

答案 1 :(得分:0)

更改此行:

$item = mysql_query("SELECT $row, count(*) as rows FROM $table $where GROUP BY count(*) ORDER BY count(*) DESC LIMIT $limit");

完成此操作后,您可能不希望将其与通用show_list函数混合使用。

随机说明。 DISTINCT在数据库上往往有些昂贵。我会避免默认这样做。

顺便提一句,你的缩进是有趣的。没有合适的程序员会想要使用该代码而无需重新格式化为某些一致的缩进方案。关于格式化的最佳方法存在无穷无尽的争论,但以下内容将是您原始代码的合理缩进:

function show_list($table, $row, $limit = 5, $where = NULL) {

    $item = mysql_query("SELECT DISTINCT $row FROM $table $where LIMIT $limit");

    $result = array();

    while ($fetch = mysql_fetch_array($item)) {    
        $result[] = $fetch;
    }
    return $result;
}

答案 2 :(得分:0)

function show_list($table, $column, $limit = 5, $where = '') {
    $item = mysql_query("SELECT $column, COUNT(*) AS c FROM $table $where
            GROUP BY $column ORDER BY c LIMIT $limit");
    $result = array();
    while ($fetch = mysql_fetch_array($item)) {
        $result[] = $fetch;
    }
    return $result;
}
  • row替换为column - 我们实际上是在变量中传递列名。
  • $where = null替换为$where = '' - 即使$wherenull,它也能确保查询正常工作。
  • 修改查询以生成预期结果(根据我对您的问题的理解)
  • 重新格式化代码并正确缩进。