我有两个表: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)。我是基于多个表中的结果选择/过滤结果的新手。
答案 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..