0

我有这个 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

4 回答 4

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,但不保证将来会这样做。

于 2013-05-26T18:01:32.783 回答
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,否则您将需要更多技巧。

于 2013-05-26T18:02:00.600 回答
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;
于 2013-05-26T18:51:03.493 回答
-1

您不能在一个查询中执行此操作。用子选择替换从地图部分

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。使用它而不是原始的映射表,您将根本不需要 group by、order 和 limit 部分。

于 2013-05-26T18:04:24.723 回答