gpt4 book ai didi

php - mysql查询上的EXISTS查询优化

转载 作者:行者123 更新时间:2023-11-29 10:31:04 24 4
gpt4 key购买 nike

我在使用 MySQL 时遇到了大数据问题。

我有:

  • 一个包含 59033 行的 users 表,以及
  • 一个包含 8753 行的 user_notes 表。

但是当我搜索哪些用户在某些日期有用户注释时。

我的查询是这样的:

SELECT u.*, rep.name as rep_name FROM users as u
LEFT JOIN users as rep on rep.id = u.add_user
LEFT JOIN authorization on authorization.id = u.authorization
LEFT JOIN user_situation_list on user_situation_list.user_situation_id = u.user_situation
WHERE
EXISTS(
select * from user_notes
where user_notes.note_user_id = u.id AND user_notes.create_date
BETWEEN "2017-10-20" AND "2017-10-22"
)
ORDER BY u.lp_modify_date DESC, u.id DESC

最佳答案

反过来——首先找到 ids;稍后处理连接。

SELECT  u.*, 
( SELECT rep.name
FROM users AS rep
WHERE rep.id = u.add_user ) AS rep_name
FROM (
SELECT DISTINCT note_user_id
FROM user_notes
WHERE create_date >= "2017-10-20"
AND create_date < "2017-10-20" + INTERVAL 3 DAY
) AS un
JOIN users AS u ON u.id = un.note_user_id
ORDER BY lp_modify_date DESC, id DESC

注释

  • 不需要GROUP BY
  • 2 个表似乎未使用;我删除了它们;
  • 我更改了日期范围;
  • 用户注释需要INDEX(create_date, note_user_id);
  • 请注意我如何将 LEFT JOIN 转换为 SELECT 列表中的子查询。

如果可以有多个 rep_names,则原始查询是“错误的”,因为 GROUP BY 将选择一个随机名称。我的答案可以通过将 rep.name 更改为以下之一来“修复”:

MAX(rep.name) -- deliver only one; arbitrarily the max

GROUP_CONCAT(rep.name) -- deliver a commalist of names

关于php - mysql查询上的EXISTS查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47408983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com