2013-09-04 2 views
0

У меня сейчас очень странная проблема с PHP и MySQL.MySQL ORDER BY и поля даты, имеющие непредсказуемые результаты

У меня есть таблица данных, которую я пытаюсь сортировать по дате. но приходит accross две странных вещей:

  1. Когда я использую PHP разбиение на страницы (с помощью LIMIT в SQL) в моем приложении, и есть несколько записей с одинаковой датой, но более двух страниц, когда я прокручиваю в секунду страница изменилась, и в результате вы видите некоторые записи, которые были на первой странице, и некоторые записи, которые вы вообще не видите!
  2. Я пошел отлаживать это, напечатав команду SQL и идентификаторы возвращаемых строк. Я скопировал и вставил одну из команд SQL PHP, и ввел эту команду непосредственно в 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 он меняет его.

Это мой код для печати идентификаторов, поэтому я не думаю, что это что-то в 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);  
} 

Возможно, это связано с этими объединениями?

Любые идеи?

+0

вы сохраняете дату в каком типе данных? –

+0

в поле даты – user1020317

+0

нормально, поэтому проблема с разбивкой на страницы, вы можете показать мне полный код? –

ответ

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 

делает distinct на id, но затем заказе на 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; 
Смежные вопросы