【问题标题】:SELECT * FROM people WHERE user_id='$user_id' ORDER BY time GROUP BY surname [closed]SELECT * FROM people WHERE user_id='$user_id' ORDER BY time GROUP BY surname [关闭]
【发布时间】:2011-11-07 11:45:15
【问题描述】:

我需要提取数据库中与某个 user_id 相关的所有条目,在它们进入数据库时​​对它们进行排序(这是 php unix time() 秒),然后按姓氏对它们进行分组,以便他们坐在同一个姓氏的条目。

这是迄今为止的查询。虽然它只给了我一定数量的条目。

$sql = "SELECT * FROM people WHERE user_token='$user_token'
        ORDER BY time GROUP BY surname";

使用 ORDER 和 GROUP by 以获得按姓氏分组但按输入时间排序的所有结果的正确方法是什么?谢谢。

【问题讨论】:

  • 到底是什么意思不起作用?如果有 2 个同姓的人在不同的时间加入,那么预期的输出是什么?
  • 尝试使用mysql_error()查看错误是什么
  • -1 甚至没有说明问题所在

标签: php mysql select group-by sql-order-by


【解决方案1】:

您的 SQL、语法、SQL 注入漏洞中存在错误,并且您可能正在使用过时的数据库扩展。所以,它应该是这样的:

$dsn = "mysql:dbname=$db_name;host=$db_host";
try{
    $pdo = new PDO($dsn, $username, $password);
}
catch(PDOException $e){
    die($e->getMessage());
}
$sql = "SELECT surname, count(id) FROM people WHERE user_token=:usr_token ORDER BY time GROUP BY surname";
$stmt = $pdo->prepare($sql);
if ($stmt->execute(array(':usr_token'=>$user_token))){
    $result = $stmt->fetchAll();
}
else{
    print_r($stmt->errorInfo());
    die("Error executing query");
}

详情请参考PDO manual

【讨论】:

    【解决方案2】:

    ORDER BY 子句应该是最后一个,但您必须指定要聚合的字段。

    如:

    SELECT surname, count(*) 
        FROM people 
        WHERE user_token='$user_token'
        GROUP BY surname
        ORDER BY surname
    

    【讨论】:

    • 这就是我一直在寻找的,尽管它似乎并没有检索到所有条目。我只得到每个姓氏中的一个。我假设count(*) 应该计算所有姓氏?那么您可以将它们全部分组并全部订购..?
    猜你喜欢
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多