首页 > 解决方案 > 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

先感谢您。

标签: mysqlsql

解决方案


JOIN运算符而不是 SQL 中的子句。它只在FROM子句中得到承认。

它对表/派生表/视图进行操作。因此,您的查询应使用LEFT JOINinFROM子句编写:

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)会加快速度。


推荐阅读