我正在尝试从表中获取多个值,其中GROUP BY仅针对其中一个列。为简化起见,我将使用模型留言簿表作为示例:
postNumber | user | text | date | portal
-----------------------------------------------
1 | Michael | "nice blog" | 10/12| fitness
2 | Ronald | "hello!" | 12/12| lounge
1 | Michael | "beautiful" | 05/11| pictures
2 | Sandra | "great pic" | 10/12| pictures
让我们假设留言板的首页必须打印最新的留言帖,但每个门户只有一个(健身,休息室和图片)。期望的结果将是:
被排除的帖子应该是Michael /" beautiful" / pictures,因为它不是该门户网站的最新版本。
以下查询对于更现代的mySQL服务器无效,抛出下述错误:
SELECT max(postNumber), user, text, date, portal FROM guestbook GROUP BY portal;
GROUP BY子句并包含nonaggregated column' database.table.columnName'它在功能上不依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by
不兼容
然而,下面这个更有限的查询有助于实现理想的结果,但它不能影响剩余的所需列(用户,文本,日期),这正是我遇到的问题:
SELECT max(postNumber), portal FROM guestbook GROUP BY portal;
应该注意的是,可以通过向GROUP BY添加用户,文本和日期来修复第一个查询,但是执行这样的复合分组将不再为每个门户检索一个条目。
如果有人能解决这个问题,请详细说明,因为我无法通过自己或在线研究找到方法。
编辑:我尝试了以下查询,没有结果,因为右边的JOIN给了我左表中的值(只有门户和帖子编号),不确定原因:
'SELECT t1.portal, max(t1.postNumber) from guestbook t1 RIGHT OUTER JOIN (SELECT * from guestbook) t2 on t1.postNumber = t2.postNumber GROUP BY portal LIMIT ?';
答案 0 :(得分:1)
你走在正确的轨道上......做一个预查询作为你想要的记录的基础,然后在合格的日期条件下重新加入同一个原始表。
select
PreQuery.Portal,
PreQuery.LatestPostNumber,
T2.User,
T2.Text,
T2.Date
from
( select
t1.Portal,
max( t1.PostNumber ) as LatestPostNumber
from
GuestBook T1
group by
t1.Portal ) PreQuery
JOIN GuestBook T2
on PreQuery.Portal = T2.Portal
AND PreQuery.PostNumber = T2.PostNumber
答案 1 :(得分:1)
请尝试以下查询
SELECT *
FROM (SELECT postNumber,
user,
text,
date,
@current_portal := portal,
@portal_rank := IF(@current_portal = portal and @portal_rank = portal, @portal_rank + 1, 1) AS portal_rank,
FROM guestbook
ORDER BY portal, date DESC) ranked
WHERE portal_rank = 1)
使用portal_rank变量对门户进行排名,并按门户和日期desc排序。 这样,您只选择每个门户的最新记录
我认为这个查询更容易理解,而且当你可以使用变量时,不需要在单个表上进行多个连接。
此外,使用portal_rank切换条件portal_rank = 1可以说< = 3,每个门户网站可以获得3条最新记录,并且查询更改最少。
希望这会有所帮助。