我有这个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
对它们进行排序,因此最新的是在每个组的顶部,然后只获得最上面的一行(即获得每组的最新行)。
有谁知道这里有什么不对吗?
由于
答案 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。使用此代替原始地图表,您根本不需要分组依据,订购和限制部分。