在mySQL 5.7.5之前,我能够弄清楚这种类型的查询,但是在5.7.5之后,由于选项sql_mode=only_full_group_by
默认启用,我有点迷失了......
我有一个查询,我想选取每组的第一行:
SELECT
w.work_id, w.`name`, CONCAT(r.recording_id, '/', r.seo_url)
FROM
work w
JOIN recording r ON w.work_id = r.work_id
JOIN `release`rl ON r.release_id = rl.release_id
WHERE
r.is_performer = 1 and r.is_video = 0
ORDER BY
w.work_id, rl.released_date_year is null, rl.released_date_year, rl.released_date_month is null, rl.released_date_day is NULL, rl.released_date_day
结果集看起来像
| work_id | name | href |
|---------|----------|------------------|
| 1 | Not so | 1/not-so |
| 2 | The moon | 2/the-moon |
| 3 | Why | 3/why. |
| 4 | A flower | 4/a-flower |
| 5 | Hello | 46/hello-world |
| 5 | Hello | 56/hello |
| 6 | A ti | 7/a-ti |
| 7 | I know | 8/i-know |
| 8 | Because | 9/because |
| 12 | Morning | 23/morning-sun |
| 12 | Morning | 84/morning-remix |
| 12 | Morning | 73/morning-beat |
| 15 | Saturday | 87/i-know |
| 16 | Night | 92/because |
我希望它返回以下内容:
| work_id | name | href |
|---------|----------|------------------|
| 1 | Not so | 1/not-so |
| 2 | The moon | 2/the-moon |
| 3 | Why | 3/why. |
| 4 | A flower | 4/a-flower |
| 5 | Hello | 46/hello-world |
| 6 | A ti | 7/a-ti |
| 7 | I know | 8/i-know |
| 8 | Because | 9/because |
| 12 | Morning | 23/morning-sun |
| 15 | Saturday | 87/i-know |
| 16 | Night | 92/because |
换句话说,我已经按照我想要的方式对行进行了排序,知道我只需要选择每个组的第一行。
我如何实现这一目标?
注意: 有类似的东西但没有答案 MySQL 5.7.5+ get first row for the groups
最佳答案
你可以尝试这样的事情
选择
w.work_id,
w.`名字`,
substring_index(GROUP_CONCAT(CONCAT(r.recording_id, '/', r.seo_url)), ',', 1) as href
从
工作
JOIN 记录 r ON w.work_id = r.work_id
JOIN `release`rl ON r.release_id = rl.release_id
在哪里
r.is_performer = 1 且 r.is_video = 0
按 w.work_id 分组
订购依据
w.work_id、rl.released_date_year 为空、rl.released_date_year、rl.released_date_month 为空、
rl.released_date_day 为 NULL,rl.released_date_day
关于mysql - 使用 MySQL sql_mode=only_full_group_by 获取组的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59691981/