0

我目前在使用 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 );    
}

也许这与那些连接有关?

有任何想法吗?

4

1 回答 1

0

您的查询:

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

正在做一个distincton id,但随后按dateReceived. 在大多数 SQL 方言中,这将是一个错误,因为order bydistinct. 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;
于 2013-09-04T11:59:02.773 回答