gpt4 book ai didi

mysql - 从表中选择记录,其中字段不在 MySql 中不同表的左连接中

转载 作者:行者123 更新时间:2023-11-29 08:14:51 25 4
gpt4 key购买 nike

努力在任何合理的运行时间得到这个。我有三张 table :

临时公司

  • id(主键)、号码(键)、s_code(键)

公司

  • id(主键)、数字(键)

公司代码

  • company_id(公司 ID 和代码上唯一)、代码 (KEY)code_description表中的code和code之间还有一个外键。company_id和company表中的id之间还有一个外键

我需要将 temp_company 表与 number 字段上的公司表进行匹配,然后我想检查 company_scode 表中公司的临时表中的 s_code 是否存在,如果不存在,则选择该行。

到目前为止我已经:

SELECT temp_company.s_code 
FROM temp_company
WHERE temp_company.s_code NOT IN
(SELECT code
FROM company
LEFT JOIN company_scode ON company.id = company_scode.company_id
WHERE
company.number = temp_company.number
)

但这非常慢,我希望有一种更好的方法来选择每个 temp_company 记录,其中 s_code 在公司和 company_scode 之间的多对多关系中不存在。

* 更新*

感谢 Loc 和 Ollie 的回答,这些问题仍然需要很长时间(我离开 Ollie's 8 小时了,但仍在继续)。

就索引而言,我已在上面更新了信息。我在下面对这两个答案进行了解释,试图阐明一些情况,并希望能更快地得到答案。

解释奥利的答案:

| id | select_type        | table      | type  | possible_keys | key        | key_len | ref                   | rows    | extra                    |
+----+--------------------+------------+-------+---------------+------------+---------+-----------------------+---------+--------------------------+
| 1 | PRIMARY | tc | ALL | (NULL) | (NULL) | (NULL) | (NULL) | 3216320 | |
+----+--------------------+------------+-------+---------------+------------+---------+-----------------------+---------+--------------------------+
| 1 | PRIMARY | <derived2> | ALL | (NULL) | (NULL) | (NULL) | (NULL) | 2619433 | Using where; Not exists |
+----+--------------------+------------+-------+---------------+------------+---------+-----------------------+---------+--------------------------+
| 2 | DERIVED | s | index | company_id | code | 62 | (NULL) | 2405379 | Using index |
+----+--------------------+------------+-------+---------------+------------+---------+-----------------------+---------+--------------------------+
| 2 | DERIVED | c | eq_ref| PRIMARY | PRIMARY | 4 | mydbname.s.company_id | 1 | |
+----+--------------------+------------+-------+---------------+------------+---------+-----------------------+---------+--------------------------+

解释 Loc 的答案:

| id | select_type        | table | type  | possible_keys | key        | key_len | ref           | rows    | extra                    |
+----+--------------------+-------+-------+---------------+------------+---------+---------------+---------+--------------------------+
| 1 | PRIMARY | tc | ALL | (NULL) | (NULL) | (NULL) | (NULL) | 3216320 | Using where |
+----+--------------------+-------+-------+---------------+------------+---------+---------------+---------+--------------------------+
| 2 | DEPENDENT SUBQUERY | c | index | (NULL) | number | 63 | (NULL) | 3189756 | Using where; Using index |
+----+--------------------+-------+-------+---------------+------------+---------+---------------+---------+--------------------------+
| 2 | DEPENDENT SUBQUERY | cc | ref | company_id | company_id | 4 | mydbname.c.id | 1 | Using where; Using Index |
+----+--------------------+-------+-------+---------------+------------+---------+---------------+---------+--------------------------+

最佳答案

测试一下:

SELECT tc.*
FROM temp_company tc
WHERE NOT EXISTS
(
SELECT 1
FROM company c LEFT JOIN company_scode cc ON c.id = cc.company_id
WHERE c.number = tc.number
)

关于mysql - 从表中选择记录,其中字段不在 MySql 中不同表的左连接中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20844324/

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