在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子句的笛卡尔乘积)
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是这个答案的唯一责任人(我同意是最好的)。