2014-09-24 2 views
2

У меня есть таблица, как следующийдисплей последние 2 записей в каждой категории из таблицы тузд

=============================================== 
id   |  category | names  | 
=============================================== 
1   |   A  | name1  | 
2   |   A  | name2  | 
3   |   A  | name3  | 
4   |   B  | name4  | 
5   |   B  | name5  | 
6   |   B  | name6  | 
7   |   B  | name7  | 
8   |   C  | name8  | 

Ожидаемый результат: name8, name7, name6, name3, name2

Я хочу, чтобы отобразить последние 2 записей в каждой категории это возможно? Кто-то Пожалуйста, помогите мне. Спасибо в advace.

ответ

3

Такого рода результаты лучше всего обрабатываются оконными функциями в других СУБД, но, к сожалению, Mysql не имеют каких-либо функций окна поэтому для альтернативы есть решение использовать определенные пользователем переменные, чтобы присвоить ранг для строк, которые принадлежат к одной группе

SELECT `id`, `category`, `names` 
FROM (
SELECT *, 
@r:= CASE WHEN @g = category THEN @r + 1 ELSE 1 END rownum, 
@g:=category 
FROM test 
    CROSS JOIN(SELECT @g:=NULL ,@r:=0) t 
    ORDER BY category,id desc 
) c 
WHERE c.rownum <=2 

Выше запроса даст вам 2 последних записей (на основе идентификатора) в категории вы можете изменить последняя часть запроса с где c lause на любое число, чтобы показать п результатов в каждой группе, например, чтобы показать 3 записи затем WHERE c.rownum <= 3 и так далее

Demo

+2

Спасибо @MKhalidJunaid. Меня устраивает. Спасибо большое :) –

-2
$query = SELECT * from table_name Order By id DESC limit 2; 

С помощью ORDER BY ... DESC он сделает выбор данных из таблицы в порядке убывания.

// execute query 
while() // fetch rows 
{ 
    $name_arr[] = $row['names']; 
} 

$output = implode(",", $name_arr); 
echo $ouput; 
+2

Посмотрите на ожидаемых результатов. Этот запрос даст имя output8, name7 –

+0

@JominGeorge: обновил мой ответ, пожалуйста, проверьте – Naincy

+0

Nop. Это неверно. –

0

Это быстро и грязно, но это, вероятно, сработает.

select 
    cats.category, 
    (select 
     a.id 
     from yourTable a 
     where a.category=cats.category 
     order by a.id desc limit 1,1) as SecondLast, 
    (select 
     a.id 
     from yourTable a 
     where a.category=cats.category 
     order by a.id desc limit 0,1) as Last, 
from 
(select distinct category from yourTable) cats 

Он будет возвращать обе последние записи в одной строке.

Если вы хотите использовать как PHP и SQL, это становится довольно тривиально, однако:

<?php 
    $sql="select distinct category from yourTable"; 
    // stuff to run this query first. 
    // Output placed into array called $array 
    foreach($array as $cat) 
    { 
     $sql="select id, category, names from yourTable where category='$cat' oder by id desc limit 2"; 
     // Do stuff here to run this inner query. 
     // Append results into array $finalArray 
     $finalArray[]=$result; 
    } 

    print_r($finalArray); 
?> 
Смежные вопросы