2011-06-16 122 views
0

我有这2个表MySQL的 - 抓住数据,同时确保域是唯一

类别,有田“的ID,类别,共有”包含字段“的ID,CATEGORY_ID,标题为”
用户

类别是用户可以选择的类别列表。
每次用户选择某个类别时,我们都会增加总计数器。 (即流行度)

如何获取基于categories.total排序的每个类别的唯一用户数据,并且user.id还需要最新?

这就是我所拥有的。除了这个之外,几乎都会抓取第一个用户标识。

select users.id from users left join categories on users.category_id = categories.id group by users.category_id order by categories.total desc 

为了说明,这里是一个例子:
类别表具有以下值
ID = 1,类别=免费,总= 3
ID = 2,类别=昂贵,总= 1
ID = 3,类别=可爱,总= 2

用户表具有以下值
ID = 1,CATEGORY_ID = 1,标题=阿伊洛
ID = 2,CATEGORY_ID = 2,标题=战时
ID = 3,CATEGORY_ID = 3,标题= zello
ID = 4,CATEGORY_ID = 1,标题= gello
ID = 5,CATEGORY_ID = 3,标题=大提琴
ID = 6,CATEGORY_ID = 1,标题= fello

的SQL查询我有返回以下用户:1,3,2

然而(第一用户与具有最大总的类别相关联的),我想要的结果,以be是:6,5,2(与最多的类别关联的LAST用户)

谢谢,
三通

回答

2

你的要求让我困惑...所以我不知道这是否会真的完成你想要什么......但它应该返回(6,5,2)(以没有特别的顺序)。如果排序很重要,请添加“ORDER BY category_id”或其他内容。

SELECT MAX(id) 
FROM users 
GROUP BY category_id; 

为了解决您的评论,试试这个(未经测试,因为我没有在任何地方安装MySQL的那样):

SELECT * 
FROM users 
WHERE id = (
    SELECT MAX(id) 
    FROM users 
    GROUP BY category_id 
); 
+0

这是超级接近。我刚刚编辑了一些问题。 MAX(id)现在会返回正确的ID。但是,与用户相关的所有其他字段仍然是与“id”相关联的字段,而不是MAX(id) – teepusink 2011-06-16 22:49:58

+0

这是因为mysql的GROUP BY非常潦草,并且不需要您使用GROUP BY或使用聚合函数,并且相反,只是选择一个(有效)随机的结果来插入这些情况下......你可能能够通过子查询来做你想做的事情...... – Flimzy 2011-06-16 22:55:14

1
select users.id from users left join categories on users.category_id = categories.id group by users.category_id order by users.id, categories.total desc 

...也许这一点,如果你想让用户ID从最低的类别开始到最高的类别。

select users.id from users left join categories on users.category_id = categories.id group by users.category_id order by categories.total asc