mysql - 在 MySQL 中,如何在子查询中创建 JOIN?

标签 mysql database subquery union

使用一张表的工作示例

SELECT t.* FROM (
  SELECT
    TITLE.name, 
    (TITLE.value-TITLE.msp) AS Lower, 
    (TITLE.value+TITLE.msp) AS Upper,
    (TITLE.value) AS Value
  FROM TITLE 
) t
WHERE 98 BETWEEN t.Lower AND t.Upper
ORDER BY ABS(98 - t.Value) ASC
LIMIT 5

使用 3 个表的所需示例(需要修复/帮助)

SELECT t.* FROM (
  SELECT
    TITLE.name, ALBUM.year, GENRE.Type
    (TITLE.value-TITLE.msp) AS Lower, 
    (TITLE.value+TITLE.msp) AS Upper,
    (TITLE.value) AS Value
  FROM TITLE, ALBUM, GENRE 
) t
WHERE ALBUM.ID=GENRE.ID AND TITLE.ID=ALBUM.ID  
AND 98 BETWEEN t.Lower AND t.Upper
ORDER BY ABS(98 - t.Value) ASC;

我收到以下错误:

ERROR 1054 (42S22): Unknown column 'ALBUM.ID' in 'where clause'

最佳答案

这是合乎逻辑的:您的子查询创建一个表 t,然后您尝试引用表 ALBUM。没有ALBUM,只有t

最快的修复方法是将 JOIN 的 WHERE 子句移动到它所属的位置:在子查询中。

SELECT t.* FROM (
  SELECT
    TITLE.name, ALBUM.year, GENRE.Type
    (TITLE.value-TITLE.msp) AS Lower, 
    (TITLE.value+TITLE.msp) AS Upper,
    (TITLE.value) AS Value
  FROM TITLE, ALBUM, GENRE 
  WHERE ALBUM.ID=GENRE.ID AND TITLE.ID=ALBUM.ID  
) t
WHERE 98 BETWEEN t.Lower AND t.Upper
ORDER BY ABS(98 - t.Value) ASC;

虽然查询本身并不那么漂亮...为什么不试试这个呢:

  SELECT
    TITLE.name, ALBUM.year, GENRE.Type
    (TITLE.value-TITLE.msp) AS Lower, 
    (TITLE.value+TITLE.msp) AS Upper,
    (TITLE.value) AS Value
  FROM TITLE
   JOIN ALBUM
    ON TITLE.ID=ALBUM.ID  
   JOIN GENRE 
    ON ALBUM.ID=GENRE.ID 
  WHERE 98 BETWEEN Lower AND Upper
  ORDER BY ABS(98 - Value) ASC;
  • 删除了不必要的子查询
  • 使用 SQL-92 风格的 JOIN 而不是 SQL-89 风格的 JOIN(带有 where 子句的笛卡尔积)

关于mysql - 在 MySQL 中,如何在子查询中创建 JOIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9199184/

相关文章:

MySQL 查询显示不正确

MySQL查询,(从子查询访问主查询)

php - 使用单个提交按钮将 html 数据保存在两个不同的 mysql 表中

mysql - Rails 4 连接关联表 - 当某些记录没有关联时进行排序

mongodb - 无法连接到启用身份验证的 MongoDB

php - 在Doctrine中使用MAX()子查询

mysql - 比较不同列时获得最低值

php - MySQL、PHP - 表单帮助

php - 在重复键的数据库更新中插入 API 结果

PostgreSQL 的数据库同步工具