写一条sql 查出 表中 PARENT_ID 字段 CREATE_TIME(创建时间) 最新的一条记录,PARENT_ID有不同的值,每个值对应多条记录
时间: 2024-04-14 07:31:02 浏览: 12
你可以使用以下 SQL 查询语句查找表中每不同 PARENT_ID 值对应的最新记录:
```sql
SELECT t1.*
FROM your_table t1
JOIN (
SELECT PARENT_ID, MAX(CREATE_TIME) AS max_create_time
FROM your_table
GROUP BY PARENT_ID
) t2 ON t1.PARENT_ID = t2.PARENT_ID AND t1.CREATE_TIME = t2.max_create_time;
```
这条查询语句使用了一个子查询,首先找到每个不同 PARENT_ID 值的最大 CREATE_TIME 值,然后将这些结果与原始表连接,以获取对应的最新记录。请将 "your_table" 替换为你实际的表名。
相关问题
mysql 菜单数据递归查询sql怎么写, 不是mysql 8 版本,没有level字段 使用parent_id 查询、
假设你的菜单表结构如下:
```
CREATE TABLE menu (
id INT PRIMARY KEY,
name VARCHAR(50),
parent_id INT
);
```
其中,`id` 是菜单项的唯一标识,`name` 是菜单项的名称,`parent_id` 是这个菜单项的父菜单项的 ID。如果一个菜单项没有父菜单项,则其 `parent_id` 为 NULL。
下面是一种递归查询菜单的 SQL 语句:
```
WITH RECURSIVE cte_menu AS (
SELECT id, name, parent_id
FROM menu
WHERE parent_id IS NULL
UNION ALL
SELECT m.id, m.name, m.parent_id
FROM menu m
JOIN cte_menu c ON m.parent_id = c.id
)
SELECT id, name, parent_id
FROM cte_menu;
```
这个 SQL 语句使用了 MySQL 中的递归公共表表达式(Recursive Common Table Expression,简称 CTE)。它首先找到所有根菜单项(即 `parent_id` 为 NULL 的菜单项),然后递归地查询它们的子菜单项,直到所有菜单项都被查询出来。
在递归查询过程中,我们使用 `JOIN` 操作将菜单表和递归查询的临时表连接起来,从而得到当前菜单项的子菜单项。最终,我们从递归查询的临时表中选择所有菜单项的 ID、名称和父菜单项的 ID。
需要注意的是,递归查询可能会导致性能问题。如果你的菜单项比较少,那么这个 SQL 语句应该可以满足你的需求。如果菜单项比较多,那么你可能需要考虑使用其他技术,比如嵌套集模型或者闭包表。
sql优化 SELECT PARENT_ORG_ID FROM TD_BFM_ORG WHERE PARENT_ORG_ID NOT IN (SELECT DISTINCT ORG_ID FROM TD_BFM_ORG)
这个 SQL 语句的意思是查询 `TD_BFM_ORG` 表中所有不在 `TD_BFM_ORG` 表中 `ORG_ID` 字段中出现过的 `PARENT_ORG_ID` 字段值。
优化可以从以下几个方面入手:
1. 使用 `NOT EXISTS` 替代 `NOT IN`,因为 `NOT IN` 的子查询结果集中如果存在 NULL 值,那么整个查询结果都是空的,而 `NOT EXISTS` 没有这个问题。
2. 添加索引:可以为 `TD_BFM_ORG` 表的 `PARENT_ORG_ID` 字段和 `ORG_ID` 字段分别创建索引,这样可以加快查询速度。
3. 减少子查询:可以将 `DISTINCT` 替换成 `GROUP BY`,这样可以减少子查询的数量。
优化后的 SQL 语句如下:
```sql
SELECT PARENT_ORG_ID
FROM TD_BFM_ORG t1
WHERE NOT EXISTS (
SELECT 1
FROM TD_BFM_ORG t2
WHERE t2.ORG_ID = t1.PARENT_ORG_ID
)
```
并且为 `PARENT_ORG_ID` 和 `ORG_ID` 分别创建索引:
```sql
CREATE INDEX idx_parent_org_id ON TD_BFM_ORG(PARENT_ORG_ID);
CREATE INDEX idx_org_id ON TD_BFM_ORG(ORG_ID);
```