0

現在、PHP と MySQL で非常に奇妙な問題が発生しています。

日付で並べ替えようとしているデータのテーブルがあります。しかし、2 つの奇妙なことに遭遇します。

  1. アプリで PHP ページネーション (SQL で LIMIT を使用) を使用し、同じ日付のレコードが 2 ページ以上ある場合、2 ページ目にスクロールすると順序が変更され、その結果、いくつかのレコードが表示されます。最初のページにあったレコードと、まったく表示されないレコードがあります。
  2. SQL コマンドと返された行の ID を出力して、これをデバッグしました。PHP が出力した SQL コマンドの 1 つをコピーして貼り付け、そのコマンドを 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

は で を実行していますdistinctid、 で注文していdateReceivedます。SQL のほとんどの方言では、これはエラーになりますorder by。. distinctMySQL は任意の値を選択しますが、これがおそらく問題の原因です。

以下は、明示的な集計を使用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 に答える