gpt4 book ai didi

mysql - SQL LEFT JOIN OR 条件的更好方法

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

我做了一些搜索但没有成功,我想知道是否有更好的方法来重写 sql 查询,因为 LEFT JOIN 中的这个 OR 条件杀死了性能:(

例如:

SELECT DISTINCT * FROM computers
LEFT JOIN monitors ON computers.brand = monitors.brand
LEFT JOIN keyboards ON computers.type = keyboards.type
LEFT JOIN accessories ON accessories.id = keyboards.id OR accessories.id = monitors.id
GROUP BY computers.id
ORDER BY computers.id DESC

很抱歉问了一个愚蠢的问题,但是是否可以重写 OR 语句来提高性能?

最佳答案

我怀疑这会有什么不同,但你可以尝试一下:

SELECT DISTINCT * 
FROM computers
LEFT JOIN monitors ON computers.brand = monitors.brand
LEFT JOIN keyboards ON computers.type = keyboards.type
LEFT JOIN accessories ON a1.id IN (keyboards.id, monitors.id)
GROUP BY computers.id
ORDER BY computers.id DESC

如果您愿意拥有两组附件列(也许在 SELECT 列表中使用 coalesce() 一堆),您也可以连接到同一个表两次:

SELECT DISTINCT * FROM computers
LEFT JOIN monitors ON computers.brand = monitors.brand
LEFT JOIN keyboards ON computers.type = keyboards.type
LEFT JOIN accessories a1 ON a1.id = keyboards.id
LEFT JOIN accessories a2 ON a2.id = monitors.id
GROUP BY computers.id
ORDER BY computers.id DESC

而且,fwiw,这个查询在大多数现代数据库引擎中都是不合法的。如果您想要GROUP BY字段,ANSI SQL标准规定您不能只将*(即使使用DISTINCT)放在SELECT 列表,因为您没有指定在数据库汇总组时要保留哪些值以及要丢弃哪些值...结果未定义,这是一件坏事。

关于mysql - SQL LEFT JOIN OR 条件的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44838393/

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