select t1.c_id c_id1, t2.c_id c_id2 from pro t1, pro t2 where t1.c_id < t2.c_id and t1.f_id = t2.f_id;
时间: 2024-04-23 15:26:04 浏览: 98
这是一个 MySQL 查询语句,用于在 pro 表中找出持有相同基金的用户对,并按照用户 ID 排序。查询结果包括两个用户 ID,其中 c_id1 < c_id2。查询中使用了自连接和比较运算符。首先,在 WHERE 子句中,通过自连接将 pro 表连接两次,分别表示两个不同的用户。然后,限制 c_id1 小于 c_id2,避免重复查询。最后,通过比较 f_id 字段,筛选出持有相同基金的用户对。
相关问题
ith pro(c_id, f_id) as ( select pro_c_id c_id, group_concat(distinct pro_pif_id order by pro_pif_id) f_id from property where pro_type = 3 group by pro_c_id ) select t1.c_id c_id1, t2.c_id c_id2 from pro t1, pro t2 where t1.c_id < t2.c_id and t1.f_id = t2.f_id;
这是一个SQL查询语句,它使用了子查询和自连接来查找拥有共同f_id的不同c_id的组合。
首先,在with子句中定义了一个名为pro的子查询,它从property表中选择所有pro_type为3的记录,然后按pro_c_id进行分组,并使用group_concat函数将每个组中的pro_pif_id连接成一个字符串,保存在f_id列中。
然后,在主查询中,使用自连接将pro表与自身连接起来,找出所有拥有相同f_id但不同c_id的组合。最后,使用where子句过滤掉重复的组合。查询结果包括两个列:c_id1和c_id2,分别表示两个拥有共同f_id的不同c_id。
总的来说,这个查询是用来查找投资基金(pro_type=3)的投资者之间是否存在共同的投资项目(f_id相同),如果存在,则返回这些投资者的组合。
update asks_over_time set is_replied = 1 where exists ( select t1.ask_id from asks t1 inner join asks_over_time t2 on t1.ask_id = t2.ask_id where t2.is_accepted = 1 and t1.handle_time is not null and t1.handle_time != '' and t1.handle_time >= t2.create_time and t2.ask_id = t1.ask_id) sql优化
这个 SQL 语句的性能瓶颈在于子查询,可以尝试对子查询进行优化。
首先,可以将子查询中的左连接改为内连接,这样可以减少不必要的记录扫描,提高查询效率。具体来说,可以将`left join`改为`inner join`。
其次,可以考虑使用`EXISTS`子查询代替`IN`子查询,因为`IN`子查询可能会存在性能问题。具体来说,可以将`where t2.ask_id = t1.ask_id`改为`where exists (select 1 from ...)`。
优化后的 SQL 语句如下:
```
update asks_over_time set is_replied = 1
where exists (
select 1 from asks t1
inner join asks_over_time t2 on t1.ask_id = t2.ask_id
where t2.is_accepted = 1 and t1.handle_time is not null
and t1.handle_time != '' and t1.handle_time >= t2.create_time
and t2.ask_id = asks_over_time.ask_id
)
```
这样的优化可以减少不必要的记录扫描和子查询的计算量,提高整个 SQL 语句的执行效率。
阅读全文