2014-01-26 2 views
-2

Мне нужна помощь в запросе mysqli. У меня есть таблица, которая содержит пользовательские поля, карты, действие ... как такПолучить последние значения n отдельных полей

id user card action time 
1 1  1  1  5 
2 1  1  2  6 
3 1  1  3  7 
4 2  1  1  8 

мне нужно получить массив 10 последних пользователей со всеми их действиями, как и

array(
    2 => array(1),  
    1 => array(1,2,3) 
) 

Я пробовал использовать разные, но он возвращает только одно действие для каждого пользователя и делает несколько запросов для него, вероятно, не лучшим решением, я не могу придумать что-нибудь еще, чтобы попробовать. Возможно, комбинированный запрос необходим, но я не могу понять, как это сделать.

Спасибо!

Хорошо, используя справку, я сделал свой собственный запрос, но по какой-то причине он не может выдержать наибольшее значение времени, все остальное работает. http://sqlfiddle.com/#!2/68751d/1

$m = new_m(); 
    if ($s = $m -> prepare("SELECT user, group_concat(action) as actions, time FROM cards_actions_data WHERE card=? GROUP BY user ORDER BY time DESC LIMIT 0, 10")) { 
     $s -> bind_param('i', $card); 
     $s -> execute(); 
     $s -> bind_result($user,$actions,$time); 
     while($s -> fetch()){ 
      $users[$user]['time'] = $time; 
      $users[$user]['actions'] = $actions; 
     } 
     $s -> close(); 

    } 
    pre($users); 
    pre($m); 
    $m -> close(); 

    return $users; 
+0

я попытался с помощью различных, но он возвращает только одно действие для каждого пользователя, я не могу думать ни о чем другом, чтобы попробовать ... – user1365447

+0

Как вы определяете «* последний пользователи * "? – eggyal

+0

Извините, моя ошибка, у меня также есть поле времени для каждого действия пользователя – user1365447

ответ

0

, как я понимаю, вы можете ищете GROUP_CONCAT. попробуйте это:

SELECT user , group_concat(`action`) actions , max(`time`) `time` 
FROM table1 
GROUP BY user 
ORDER BY `time` DESC 
LIMIT 10 

LOOK demo here

+0

Спасибо, это сработало, но с небольшой проблемой. У меня также есть поле времени, и я хочу, чтобы последний пользователь сделал действие первым. (SELECT user, group_concat ('action') как действия FROM cards_actions_data WHERE card =? GROUP BY user ORDER BY time DESC LIMIT 0, 10") – user1365447

+0

Работал на скрипке, но не для меня, нужно посмотреть, что не так с моим запросом , Большое спасибо! http://sqlfiddle.com/#!2/87962/1 – user1365447

+0

Его действительно странно, я скопировал запрос непосредственно в phpmyadmin, но результат был испорчен только на моем компьютере. Это dosent показывает наивысшее значение времени. – user1365447

0
SELECT user, GROUP_CONCAT(action) 
FROM  my_table NATURAL JOIN (
      SELECT DISTINCT user FROM my_table ORDER BY time DESC LIMIT 10 
     ) t 
GROUP BY user 
Смежные вопросы