作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我做了一些搜索但没有成功,我想知道是否有更好的方法来重写 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/
我是一名优秀的程序员,十分优秀!