在MySQL中,如何在子查询中创建联接?

在MySQL中,如何在子查询中创建联接?,mysql,database,subquery,union,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 LIMI

使用一个表格的工作样本

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张表的所需示例(需要修复/帮助)

我得到以下错误:

错误1054(42S22):“where子句”中的未知列“ALBUM.ID”


查看您的查询:您正在定义一个名为
T
的子查询,它在表
标题
相册
体裁
之间进行查询然后从该子查询中选择,并尝试在
标题
专辑
流派
上应用
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;

查看您的查询:您正在定义一个名为
T
的子查询,它在表
标题
相册
体裁
之间进行查询然后从该子查询中选择,并尝试在
标题
专辑
流派
上应用
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;

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

最快的修复方法是在子查询中移动它所属连接的
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 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样式联接而不是SQL-89样式联接(带where子句的笛卡尔乘积)

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

      最快的修复方法是在子查询中移动它所属连接的
      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 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样式联接而不是SQL-89样式联接(带where子句的笛卡尔乘积)

      将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
      AND 98 BETWEEN t.Lower AND t.Upper
      ORDER BY ABS(98 - t.Value) ASC;
      

      将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
      AND 98 BETWEEN t.Lower AND t.Upper
      ORDER BY ABS(98 - t.Value) ASC;
      

      您的子查询(“t”)将返回标题、唱片集和流派的交叉连接结果集,其中不包括它们各自的ID值。WHERE子句只能对
      t
      的投影进行操作。您的子查询(“t”)将返回标题、唱片集和流派的交叉连接结果集,其中不包括它们各自的ID值。你的WHERE子句只能在
      t
      @Jammin我刚刚修正了他的“笛卡尔”拼写:)Konerak是这个答案的唯一责任人(我同意是最好的)。@Jammin我刚刚修正了他的“笛卡尔”拼写:)Konerak是这个答案的唯一责任人(我同意是最好的)。