赞
踩
在 MySQL 8.0 及更高版本中,LATERAL 是一个用于派生表(derived tables)的关键字,它允许派生表中的查询引用包含该派生表的 FROM 子句中的表。这在执行某些复杂的查询时特别有用,尤其是当需要在子查询中引用外部查询的列时。
以下是关于 MySQL 8.0 中 LATERAL 的几个关键点:
SELECT ...
FROM outer_table
JOIN LATERAL (
SELECT ...
FROM inner_table
WHERE inner_table.column = outer_table.column
-- 可以使用更多条件和逻辑
) AS subquery_alias
ON some_condition;
CREATE TABLE t_city_list( id bigint auto_increment primary key, country varchar(64), city varchar(64) ); INSERT INTO t_city_list(country,city) VALUES ('中国','北京'),('中国','广州'),('中国','深圳'),('中国','香港'),('中国','上海'),('日本','东京'),('日本','大阪'); --查询数据 select * from t_city_list; mysql> select * from t_city_list; +----+---------+--------+ | id | country | city | +----+---------+--------+ | 1 | 中国 | 北京 | | 2 | 中国 | 广州 | | 3 | 中国 | 深圳 | | 4 | 中国 | 香港 | | 5 | 中国 | 上海 | | 6 | 日本 | 东京 | | 7 | 日本 | 大阪 | +----+---------+--------+ 7 rows in set (0.00 sec)
语法:
group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ‘分隔符’])
分组后,把合并字段的值,合并于一个字段中,默认,分隔 通过设置SEPARATOR修改分隔符
select country,group_concat(city) from t_city_list group by country;
+---------+------------------------------------+
| country | group_concat(city) |
+---------+------------------------------------+
| 中国 | 北京,广州,深圳,香港,上海 |
| 日本 | 东京,大阪 |
+---------+------------------------------------+
-- on some_condition
select * from t_city_list t1
join lateral (select country,
group_concat(city separator'-') as city_list
from t_city_list
where country=t1.country) t2
on t2.country=t1.country;
-- on true
select * from t_city_list t1
join lateral (select country,
group_concat(city separator'-') as city_list
from t_city_list
where country=t1.country) t2
on true;
在MySQL5.7版本实现相同的需求,则需要子查询分组Group_concat,之后依据关联字段进行join
mysql> select t1.* ,t2.group_concat_city -> from t_city_list t1 -> join(select country,group_concat(city) as group_concat_city -> from t_city_list -> group by country) t2 -> on t2.country=t1.country; +----+---------+--------+------------------------------------+ | id | country | city | group_concat_city | +----+---------+--------+------------------------------------+ | 1 | 中国 | 北京 | 北京,广州,深圳,香港,上海 | | 2 | 中国 | 广州 | 北京,广州,深圳,香港,上海 | | 3 | 中国 | 深圳 | 北京,广州,深圳,香港,上海 | | 4 | 中国 | 香港 | 北京,广州,深圳,香港,上海 | | 5 | 中国 | 上海 | 北京,广州,深圳,香港,上海 | | 6 | 日本 | 东京 | 东京,大阪 | | 7 | 日本 | 大阪 | 东京,大阪 | +----+---------+--------+------------------------------------+ 7 rows in set (0.00 sec)
通过 LATERAL,MySQL 8.0 提供了更强大和灵活的查询功能,特别是在处理涉及复杂逻辑和聚合的查询时。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。