使用一张表的工作示例
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/