如何订购分组并获得第一排?

时间:2013-05-26 17:45:14

标签: mysql sql select

我有这个php mysql语句

SELECT a.*, p.filename, m.`first name`, m.`last name`, m.`mobile number`, m.`status`, m.`email address`
FROM map a
join members m on a.members_id = m.id
join pictures p on m.pictures_id = p.id
WHERE a.active = 1
GROUP BY a.members_id
order by a.`date added` DESC
limit 1;

然而它不起作用。映射表具有记录,其中许多可以具有相同的members_id值。我想按members_id对它们进行分组,然后按date added对它们进行排序,因此最新的是在每个组的顶部,然后只获得最上面的一行(即获得每组的最新行)。

有谁知道这里有什么不对吗?

由于

4 个答案:

答案 0 :(得分:0)

尝试:

select * from
(SELECT a.*, 
        p.filename, 
        m.`first name`, m.`last name`, m.`mobile number`, m.`status`, m.`email address`
 FROM map a
 join members m on a.members_id = m.id
 join pictures p on m.pictures_id = p.id
 WHERE a.active = 1
 order by a.members_id, a.`date added` DESC) sq
GROUP BY members_id;

请注意,MySQL没有记录分组时返回第一行的事实,并且可能在将来的版本中更改 - 所以尽管此查询应该与当前版本的MySQL一起使用,但不保证将来这样做。

答案 1 :(得分:0)

如果您希望每个地图获得一个结果,则必须分两步选择 - 因此使用子查询。内部查询获取每个成员的最新映射,外部查询获取所有数据。注意指数,否则会很慢。

我认为它会是这样的:

    SELECT a.*, p.filename, m.`first name`, m.`last name`, m.`mobile number`, m.`status`, m.`email address`
FROM map a
inner join members m on a.members_id = m.id
inner join pictures p on m.pictures_id = p.id
inner join (
    select max(a.`date added`) as maxdate from map ia where ia.members_id = m.id)
) as sub_a on sub_a.member_id = a.member_id and sub_a.maxdate = a.`date added` 
WHERE a.active = 1

这取决于单个最大date added,否则您将需要更多技巧。

答案 2 :(得分:0)

一种方法是使用where子句过滤掉您不感兴趣的记录:

SELECT a.*, p.filename, m.`first name`, m.`last name`, m.`mobile number`, m.`status`, m.`email address`
FROM map a
join members m on a.members_id = m.id
join pictures p on m.pictures_id = p.id
WHERE a.active = 1 and
      a.`date added` = (select max(map.`date added`)
                        from map
                        where map.members_id = a.members_id and
                              map.active = 1
                       )
GROUP BY a.members_id
order by a.`date added` DESC;

答案 3 :(得分:-1)

您不能在一个查询中执行此操作。用子选择

替换from map部分
select max(map_id) as map_id, members_id, max(date_added) as date_added from map where active = 1 group by members_id

这将为您提供所有会员的最后日期。我假设你的map_id存在,并且是auto_increment。使用此代替原始地图表,您根本不需要分组依据,订购和限制部分。