2015-02-10 5 views
-1

Я хочу получить результаты из таблицы userdata с порядком по левому соединению, его запуск, но его порядок неправильный.LEFT JOIN с ORDER BY и CASE

SELECT 
u.id, 
u.name, 
f.tstamp 
FROM userdata AS u 
LEFT JOIN messages AS f ON (u.id=f.user_id) OR (u.id=f.friend_id) 
WHERE u.id IN 
    (
     SELECT CASE 
     WHEN user_id='".$uid."' 
     THEN friend_id 
     ELSE user_id 
     END FROM `friends` 
     WHERE 
     (
      user_id='".$uid."' or friend_id = '".$uid."' 
     ) 
     and type=2 
    ) 
GROUP BY u.id 
ORDER BY f.tstamp ASC, u.onl DESC, u.name 

UserData> все пользователи

Друзья> Друзья (1 строка на 2 пользователей)

сообщения> строки до 400

так, что пропущено работает, но его использование старейшей TSTAMP (временная метка) из строки не самой новой.

+0

Попробуйте 'f.tstamp DESC' вместо' ASC'. –

+0

Как правило, вопросы sql переходят на http://dba.stackexchange.com/ –

ответ

0

Вы заказываете timestamp ASC, что означает наивысшее значение в первую очередь. В случае timestamp будет менее недавний первый

Вместо этого попробуйте ORDER BY f.tstamp DESC

Кроме того, я думаю, что вы хотите, чтобы выбрать max(f.tstamp) вместо f.tstamp

+0

тот же эффект, выводит старую временную метку ... –

+0

Вы использовали 'order by f.tstamps desc', и результат тот же? –

+0

Я знаю, что это смущает, но это ... эта временная шкала 1423592380 подходит, но я хочу этого 1423592409 .... –