如何在没有任何重复的情况下根据另一个表中的最新结果选择结果?

时间:2014-06-01 18:25:09

标签: mysql

我有两个表:groups和group_activity。组的结构是

  

id int(11)无符号自动增量
  creator varchar(15)
  name varchar(30)
  说明文字
  join_policy tinyint(1)
  avatar varchar(500)
  date_created varchar(13)

group_activity表的结构是

  

id int(11)自动增量
  group_id int(11)
  动作tinytext

group_activity 表中的 group_id 列与表中的 id 相关,因此当您转到在特定组的页面中,您可以看到与其相关的所有活动。

我正在为我是管理员的网站构建群组功能,并且群组主页上的其中一个内容是“最近活跃的群组”。也许我这样做错了,如果我能,请告诉我最好的方法吗?

我目前要做的是显示按group_activity中最新结果排序的组,但不显示来自groups表的任何重复组名称​​ name varchar(30)。我是基于多个表中的结果选择/过滤结果的新手。

3 个答案:

答案 0 :(得分:1)

您可以通过获取每组auto_increment列的最大值来为活动表使用自联接

select g.*,ga.*
from group_activity ga
join (select max(id) id , group_id from group_activity group by group_id ) gaa
on(ga.id=gaa.id)
join groups g on (ga.group_id =g.id)

子查询gaa将给出最大ID,即每个组的最新ID,并且您再次加入group_activity表的自加入以从您的表中获取操作,并在最后加入您的组表

根据评论进行修改

您可以为选择列指定唯一的别名

select g.*,ga.id AS ga_id ,ga.group_id AS ga_group_id,ga.action AS ga_action
from group_activity ga
join (select max(id) id , group_id from group_activity group by group_id ) gaa
on(ga.id=gaa.id)
join groups g on (ga.group_id =g.id)

现在,在您的PHP代码中,当您获取数据时,您可以将其用作

$row['id'] <---- Belongs to id of group
$row['creator '] <---- Belongs to creator column of group
$row['ga_id '] <---- Belongs to id of group_activity 
$row['ga_group_id'] <---- Belongs to group id of group_activity 
$row['ga_action'] <---- Belongs to action column of group_activity 

答案 1 :(得分:1)

如果我理解正确,并且您想按行动顺序订购群组, 在其中执行,您可以使用此查询,它按 group_id 对活动记录进行分组,按自动增量字段的最大值排序并加入表。

select group_id, MAX(ga.id) AS max_id, g.name
from group_activity ga
left join groups g ON ga.group_id = g.id
group by group_id
order by max_id desc

如果您不需要特定的已执行操作,则只需在表中添加字段 date_last_activity ,在组中的每个操作上更新它,您将查询变得简单

select * from groups order by date_last_activity desc;

即使您确实需要 group_activity 表来解决其他问题,也可以这样做,但它会为您的方案添加一点非规范化。

我也有一些建议:

  • 不要将varchar类型用于日期字段,这样更合适 在这种情况下,mysql中的日期字段。

  • 如果你想在你的方案中使用连接,你最好在
    上创建索引 group_id 字段。当你的桌子变大时,这将非常有用。

答案 2 :(得分:0)

SELECT DISTINCT name FROM groups..