有一个表messages
包含如下所示的数据:
Id Name Other_Columns
-------------------------
1 A A_data_1
2 A A_data_2
3 A A_data_3
4 B B_data_1
5 B B_data_2
6 C C_data_1
Run Code Online (Sandbox Code Playgroud)
如果我运行查询select * from messages group by name
,我会得到如下结果:
1 A A_data_1
4 B B_data_1
6 C C_data_1
Run Code Online (Sandbox Code Playgroud)
什么查询将返回以下结果?
3 A A_data_3
5 B B_data_2
6 C C_data_1
Run Code Online (Sandbox Code Playgroud)
也就是说,应返回每组中的最后一条记录.
目前,这是我使用的查询:
SELECT
*
FROM (SELECT
*
FROM messages
ORDER BY id DESC) AS x
GROUP BY name
Run Code Online (Sandbox Code Playgroud)
但这看起来非常低效.还有其他方法可以达到相同的效果吗?
我已经升级了我的系统,并为我正在处理的Web应用程序安装了MySql 5.7.9和php.我有一个动态创建的查询,当在旧版本的MySql中运行时,它可以正常工作.自升级到5.7后,我收到此错误:
SELECT列表的表达式#1不在GROUP BY子句中,并且包含非聚合列'support_desk.mod_users_groups.group_id',它在功能上不依赖于GROUP BY子句中的列; 这与sql_mode = only_full_group_by不兼容
请注意有关服务器SQL模式主题的Mysql 5.7的手册页.
这是给我带来麻烦的查询:
SELECT mod_users_groups.group_id AS 'value',
group_name AS 'text'
FROM mod_users_groups
LEFT JOIN mod_users_data ON mod_users_groups.group_id = mod_users_data.group_id
WHERE mod_users_groups.active = 1
AND mod_users_groups.department_id = 1
AND mod_users_groups.manage_work_orders = 1
AND group_name != 'root'
AND group_name != 'superuser'
GROUP BY group_name
HAVING COUNT(`user_id`) > 0
ORDER BY group_name
Run Code Online (Sandbox Code Playgroud)
我在这个问题上做了一些谷歌搜索,但我不明白only_full_group_by
弄清楚我需要做些什么来修复查询.我可以关掉这个only_full_group_by
选项,还是我需要做些什么呢?
如果您需要更多信息,请与我们联系.
我希望能够从电子邮件表中选择一堆行,并通过发件人对它们进行分组.我的查询如下所示:
SELECT
`timestamp`, `fromEmail`, `subject`
FROM `incomingEmails`
GROUP BY LOWER(`fromEmail`)
ORDER BY `timestamp` DESC
Run Code Online (Sandbox Code Playgroud)
查询几乎按我的意愿运行 - 它选择通过电子邮件分组的记录.问题是主题和时间戳不对应于特定电子邮件地址的最新记录.
例如,它可能会返回:
fromEmail: john@example.com, subject: hello
fromEmail: mark@example.com, subject: welcome
Run Code Online (Sandbox Code Playgroud)
当数据库中的记录是:
fromEmail: john@example.com, subject: hello
fromEmail: john@example.com, subject: programming question
fromEmail: mark@example.com, subject: welcome
Run Code Online (Sandbox Code Playgroud)
如果"编程问题"主题是最新的,那么在分组电子邮件时如何让MySQL选择该记录呢?
我需要找到每个作者的最新帖子,然后对结果进行分组,这样我每个作者只会发一个最新的帖子.
SELECT wp_posts.* FROM wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY wp_posts.post_author
ORDER BY wp_posts.post_date DESC
Run Code Online (Sandbox Code Playgroud)
这是正确地对输出进行分组,因此我每个作者只获得一个帖子,但是在分组后将结果排序,而不是在选择之前.
我有下表:
ID NAME TIME 1 A 0 2 A 3 3 B 1
我使用下面的查询产生:
SELECT * FROM `table` GROUP BY `NAME`
Run Code Online (Sandbox Code Playgroud)
ID NAME TIME 1 A 0 3 B 1
我想用它GROUP BY
来生成这样的结果(按TIME列折扣排序):
ID NAME TIME 2 A 3 3 B 1
我有一张表,我试图检索每个安全的最新位置:
桌子:
我创建表的查询: SELECT id, security, buy_date FROM positions WHERE client_id = 4
+-------+----------+------------+
| id | security | buy_date |
+-------+----------+------------+
| 26 | PCS | 2012-02-08 |
| 27 | PCS | 2013-01-19 |
| 28 | RDN | 2012-04-17 |
| 29 | RDN | 2012-05-19 |
| 30 | RDN | 2012-08-18 |
| 31 | RDN | 2012-09-19 |
| 32 | HK | 2012-09-25 |
| 33 | HK | 2012-11-13 |
| 34 …
Run Code Online (Sandbox Code Playgroud) 我已经看过这两个问题了:
但是它们都使用聚合函数MAX来获得最高值或填充值,这对我的情况不起作用.
出于这个问题的目的,我简化了我的情况.这是我目前的数据:
我想获得每条路线的运营商名称,但是关于旅行方向(即订购或"偏好"值).这是我的伪代码:
if(`direction` = 'west' AND `operatorName` != '') then select `operatorName`
else if(`direction` = 'north' AND `operatorName` != '') then select `operatorName`
else if(`direction` = 'south' AND `operatorName` != '') then select `operatorName`
else if(`direction` = 'east' AND `operatorName` != '') then select `operatorName`
Run Code Online (Sandbox Code Playgroud)
我当前的SQL查询是:
SELECT route, operatorName
FROM test
GROUP BY route
Run Code Online (Sandbox Code Playgroud)
这给了我分组,但我的目的是错误的运算符:
route | operatorName
--------------------
95 | James
96 | Mark
97 | Justin
Run Code Online (Sandbox Code Playgroud)
我尝试过应用一个ORDER BY
条款但GROUP BY …