mysql cte写法
时间: 2023-10-12 15:18:38 浏览: 88
MySQL不支持CTE(公共表表达式)写法,但是可以使用子查询或者临时表来实现类似的功能。
子查询写法:
```
SELECT *
FROM (
SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY col1) as row_num
FROM table1
WHERE col1 > 100
) t
WHERE t.row_num BETWEEN 10 AND 20;
```
临时表写法:
```
CREATE TEMPORARY TABLE temp_table
SELECT col1, col2
FROM table1
WHERE col1 > 100;
SELECT *
FROM (
SELECT col1, col2, ROW_NUMBER() OVER (ORDER BY col1) as row_num
FROM temp_table
) t
WHERE t.row_num BETWEEN 10 AND 20;
DROP TEMPORARY TABLE temp_table;
```
相关问题
转化为mysql8的写法
在MySQL 8中,您可以使用CTE(Common Table Expression)和窗口函数来实现相同的查询。以下是将查询转换为MySQL 8写法的示例:
```sql
WITH monthly_counts AS (
SELECT DATE_FORMAT(created, '%Y-%m') AS created_month, COUNT(*) AS c,
ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC, created_month DESC) AS rn
FROM t_post
GROUP BY created_month
)
SELECT created_month, c
FROM monthly_counts
ORDER BY rn;
```
在这个示例中,我们首先使用CTE定义一个名为"monthly_counts"的子查询,该子查询计算每个月的创建数量,并使用ROW_NUMBER()函数为每个月份生成一个排名。然后,我们在主查询中选择创建月份和数量,并按排名排序。
请注意,上述查询假设您的MySQL 8版本支持窗口函数。如果您的版本不支持窗口函数,将无法使用此写法。
mysql5.7支持这种写法吗
是的,MySQL 5.7版本也支持使用with recursive语句进行递归查询。在MySQL 5.7及以上版本中,可以使用以下语句进行递归查询:
```
with recursive cte as (
select id, name, parent_id
from tree
where id = 1
union all
select t.id, t.name, t.parent_id
from tree t
inner join cte on t.parent_id = cte.id
)
select * from cte;
```
注意,需要使用with recursive语句,并且在递归查询语句中使用union all进行联合。如果需要在MySQL 5.7之前的版本中使用递归查询,可以使用其他方式实现,例如使用存储过程等。
阅读全文