我有一个如下表
===============================================
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个条目是否可能? 有人请帮帮我。谢谢你的推荐。
答案 0 :(得分:3)
这些类型的结果最好由其他RDBMS中的窗口函数处理,但不幸的是,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个最近的记录(基于id)每个类别您可以使用where子句更改查询的最后部分到任何数字以显示每组的n个结果,例如显示3个记录然后{{1} <等等
答案 1 :(得分: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);
?>
答案 2 :(得分:-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;