目前我在使用 PHP 和 MySQL 时遇到了一个非常奇怪的问题。
我有一个数据表,我正在尝试按日期排序。但遇到了两个奇怪的事情:
- 当我在我的应用程序中使用 PHP 分页(在 SQL 中使用 LIMIT)时,有一些具有相同日期的记录,但超过两页,当我滚动到第二页时,顺序发生了变化,因此您会看到一些位于首页的记录,以及一些您根本看不到的记录!
- 我通过打印 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/