php - MySQL ORDER BY 和日期字段具有不可预测的结果

标签 php mysql

目前我在使用 PHP 和 MySQL 时遇到了一个非常奇怪的问题。

我有一个数据表,我正在尝试按日期排序。但遇到了两个奇怪的事情:

  1. 当我在我的应用程序中使用 PHP 分页(在 SQL 中使用 LIMIT)时,有一些具有相同日期的记录,但超过两页,当我滚动到第二页时,顺序发生了变化,因此您会看到一些位于首页的记录,以及一些您根本看不到的记录!
  2. 我通过打印 SQL 命令和返回的行 ID 来对此进行调试。我复制并粘贴了 PHP 打印的 SQL 命令之一,并将该命令直接插入到 phpMyAdmin 中,它以不同的顺序返回了设置的值!

这是我的命令:

SELECT DISTINCT a.id 
FROM orders as a, companies as b, orderProducts as e 
WHERE a.companyId = b.id AND a.id = e.orderId AND a.deleted = 0 AND a.id <> 0 
ORDER BY a.dateReceived DESC 
LIMIT 45, 15

当通过 phpMyAdmin 完成时,该命令似乎按预期工作;它保留相同的顺序,但通过 PHP 改变了它。

这是我用于打印 ID 的代码,所以我认为它不是 PHP 中的东西。

$result = mysql_query( $query ) or die( 'A mysql error has occured: ' . mysql_error(). $query );
$ids = array();
while($row = mysql_fetch_assoc($result)) {
    $ids[]=$row['id'];
}
if( $_GET['debug'] == "true" ) {        
    echo "Query: ".$query." IDs: ";
    print_r( $ids );    
}

也许这与这些连接有关?

有什么想法吗?

最佳答案

您的查询:

SELECT DISTINCT a.id 
FROM orders as a, companies as b, orderProducts as e 
WHERE a.companyId = b.id AND a.id = e.orderId AND a.deleted = 0 AND a.id <> 0 
ORDER BY a.dateReceived DESC 
LIMIT 45, 15

正在对id执行distinct,然后按dateReceived排序。在大多数 SQL 方言中,这将是一个错误,因为 order by 列在 distinct 之后不可用。 MySQL 选择任意值,这可能是导致您的问题的原因。

以下内容使用显式聚合和 max() 来解决此问题:

SELECT a.id 
FROM orders as a, companies as b, orderProducts as e 
WHERE a.companyId = b.id AND a.id = e.orderId AND a.deleted = 0 AND a.id <> 0 
GROUP BY a.id
ORDER BY max(a.dateReceived) DESC 
LIMIT 45, 15;

关于php - MySQL ORDER BY 和日期字段具有不可预测的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18613171/

相关文章:

mysql - 在大表中每组选择一个随机行

php - 单词的正则表达式

php - 如何将 Eloquent 结果放入数组 Laravel

php - CakePHP:清除提交失败的密码字段

javascript - 具有 PHP 和 JavaScript 绑定(bind)的可移植表达式语言?

php - 如何使用 api 获取所有谷歌搜索结果

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql索引状态和内存中运行索引

mysql - 获取两个日期之间的数据

php - 我需要通过 PHP 上的 SQL 查询显示存储在图库中的图像