MySQL左连接后获取唯一cat_id及GROUP BY语法错误咨询
解决SQL GROUP BY语法错误及获取唯一cat_id的方案
嘿,我来帮你搞定这个问题!首先咱们理清你遇到的问题根源,再针对需求给出合适的解决方案。
你的原查询与结果
先看你最初的正确查询语句:
SELECT i.id , i.user_id , i.date , h.cat_id FROM io__image i LEFT JOIN io__image_cat_hext h ON h.image_id = i.id WHERE i.home_granted >= 1 AND user_id = 40 ORDER BY i.date DESC
查询结果整理成表格更清晰:
| id | user_id | date | cat_id |
|---|---|---|---|
| 530 | 40 | 2018-05-12 20:45:54 | 42 |
| 528 | 40 | 2018-05-11 22:59:17 | 42 |
| 518 | 40 | 2018-05-11 17:22:30 | 42 |
| 508 | 40 | 2018-05-09 13:45:40 | 37 |
| 504 | 40 | 2018-05-06 22:40:31 | 37 |
| 492 | 40 | 2018-05-02 21:21:20 | 37 |
| 490 | 40 | 2018-05-02 16:16:09 | 36 |
| 481 | 40 | 2018-05-02 15:08:35 | 36 |
语法错误的原因
你尝试用GROUP BY获取唯一cat_id,但写错了语句顺序,导致报错:
SELECT i.id , i.user_id , i.date , h.cat_id FROM io__image i GROUP BY h.cat_id LEFT JOIN io__image_cat_hext h ON h.image_id = i.id WHERE i.home_granted >= 1 AND user_id = 40 ORDER BY i.date DESC
错误信息:
Syntax near 'LEFT JOIN io__image_cat_hext ON io__image_cat_hext.image_id = io__image.id WHER' on line 4
SQL语句的语法顺序是严格规定的,正确顺序为:SELECT → FROM → JOIN → WHERE → GROUP BY → ORDER BY
你把GROUP BY放在了LEFT JOIN之前,数据库无法识别这个语法,所以抛出了错误。
针对“获取唯一cat_id”的解决方案
根据你的需求,分两种场景给出方案:
场景1:仅需要去重后的cat_id列表
如果只是想要得到不重复的cat_id值,不需要关联图片的其他信息,可以用两种写法:
写法1:使用DISTINCT
SELECT DISTINCT h.cat_id FROM io__image i LEFT JOIN io__image_cat_hext h ON h.image_id = i.id WHERE i.home_granted >= 1 AND i.user_id = 40
写法2:使用GROUP BY(位置正确)
SELECT h.cat_id FROM io__image i LEFT JOIN io__image_cat_hext h ON h.image_id = i.id WHERE i.home_granted >= 1 AND i.user_id = 40 GROUP BY h.cat_id
这两种写法都会返回唯一的cat_id:36、37、42。
场景2:每个cat_id对应最新的图片记录
如果你想要每个cat_id对应的**最新(date最晚)**的图片完整信息(id、user_id、date),可以用窗口函数ROW_NUMBER()实现:
SELECT id, user_id, date, cat_id FROM ( SELECT i.id, i.user_id, i.date, h.cat_id, -- 按cat_id分组,每组内按date倒序排序,给每条记录编号 ROW_NUMBER() OVER (PARTITION BY h.cat_id ORDER BY i.date DESC) AS rn FROM io__image i LEFT JOIN io__image_cat_hext h ON h.image_id = i.id WHERE i.home_granted >= 1 AND i.user_id = 40 ) t -- 只取每组的第一条(最新的记录) WHERE rn = 1 ORDER BY date DESC
执行后会得到如下结果:
| id | user_id | date | cat_id |
|---|---|---|---|
| 530 | 40 | 2018-05-12 20:45:54 | 42 |
| 508 | 40 | 2018-05-09 13:45:40 | 37 |
| 490 | 40 | 2018-05-02 16:16:09 | 36 |
内容的提问来源于stack exchange,提问作者London Smith
相关产品推荐
相关产品推荐

