mysql - WHEN 条件在 JOIN 查询中如何工作?
问题描述
这个查询的问题在哪里?我想不出办法让它工作。我只需要选择 id = 4 的“ricette”,然后加入另一个表“val”。我不知道在哪里放置 WHERE 条件“WHERE ric.id = 4”。如果没有“WHERE ric.id = 4”,则查询有效,但显然它会返回表“ricette”中的所有值,而不仅仅是“ricette.id = 4”。
这是查询:
SELECT * FROM ricette AS ric WHERE ric.id = 4
LEFT JOIN (SELECT id_ricetta, AVG(valutazione) AS media
FROM `valutazioni` GROUP BY id_ricetta) AS val ON ric.id = val.id_ricetta
先感谢您。
解决方案
JOIN
是运算符而不是 SQL 中的子句。它只在FROM
子句中得到承认。
它对表/派生表/视图进行操作。因此,您的查询应使用LEFT JOIN
inFROM
子句编写:
SELECT *
FROM ricette AS ric LEFT JOIN
(SELECT id_ricetta, AVG(valutazione) AS media
FROM `valutazioni`
GROUP BY id_ricetta
) AS val
ON ric.id = val.id_ricetta
WHERE ric.id = 4 ;
您会注意到,当我编写代码时,如果带有运算符的表达式跨越多行,我会将运算符放在行尾。对我来说,这清楚地表明表达式跨越多行。
另一方面,我左对齐 SQL 查询中的子句。这些通常是: SELECT
, FROM
, WHERE
, GROUP BY
, HAVING
, 和ORDER BY
。
请注意,以下是您的查询的更高性能版本:
SELECT r.*,
(SELECT AVG(v.valutazione)
FROM valutazioni v
WHERE v.id_ricetta = r.id
) as media
FROM ricette r
WHERE ric.id = 4 ;
这样做的原因是简单的。您正在过滤查询中的结果。但是,您的版本正在聚合所有-valutazationi
这(可能)是更多的数据,并且只是id = 4
. 上的索引valutazioni(id_ricetta, valutazione)
会加快速度。
推荐阅读
- webpack - 当 nativescript 应用程序与 webpack 捆绑时出现 Javascript 堆错误
- python - 在循环中的单独行上打印值时,如何避免在最后一次迭代后打印换行符?
- regex - 正则表达式 - 否定两种模式
- vue.js - Vuex 状态未从本地存储更新
- mysql - 在mysql中存储一个位置的一系列纬度和经度
- node.js - 我无法让 express.static() 为我工作
- javascript - Nodejs:我想从 nba.com/stats 抓取 html,但我没有通过请求获得整个 html
- conv-neural-network - 每个班级应该有多少张图像(最少)来训练 YOLO?
- python-3.x - 保留注册表值的双引号
- r - 根据扩展网格类别汇总原始数据