第一个查询有效:
SELECT video.seller from video;
第二个不是:
SELECT SQL_CALC_FOUND_ROWS *,
t.name as tname
FROM video, type as t
INNER JOIN user
ON video.seller = user.id
WHERE video.type2 = t.id
AND thumbnail_blobKey != ''
AND disabled = 0
AND is_reel = 0
AND price!= 0
AND video.type != 4
GROUP BY video.id
ORDER BY video.id DESC LIMIT 0, 10
Error : Unknown column 'video.seller' in 'on clause'
最佳答案
这是一个有趣的例子。更好的格式:
SELECT SQL_CALC_FOUND_ROWS *, t.name as tname
FROM video, type as t INNER JOIN
user
ON video.seller = user.id
WHERE video.type2 = t.id AND
thumbnail_blobKey != '' AND disabled = 0 AND is_reel = 0 AND price!= 0 AND video.type != 4
GROUP BY video.id
ORDER BY video.id DESC
LIMIT 0, 10
问题是 video
的列在 from
子句的其余部分中不被理解,因为 ,
。这就是逗号的作用。有趣的是,它可以通过将 ,
替换为逻辑上的等效 cross join
来修复:
SELECT SQL_CALC_FOUND_ROWS *, t.name as tname
FROM video cross join type as t INNER JOIN
user
ON video.seller = user.id
WHERE video.type2 = t.id AND
thumbnail_blobKey != '' AND disabled = 0 AND is_reel = 0 AND price!= 0 AND video.type != 4
GROUP BY video.id
ORDER BY video.id DESC
LIMIT 0, 10
这在 documentation 中有解释原因是优先。逗号的优先级低于 cross join
。因此,您的表达式中的连接被评估为“视频连接(类型连接用户)”。因为第二个连接首先被解释,所以 video
中的列是未知的。
但是表上确实有join,所以写成这样比较好:
SELECT SQL_CALC_FOUND_ROWS *, t.name as tname
FROM video join
type t
on video.type2 = t.id INNER JOIN
user
ON video.seller = user.id
WHERE thumbnail_blobKey != '' AND disabled = 0 AND is_reel = 0 AND price!= 0 AND video.type != 4
GROUP BY video.id
ORDER BY video.id DESC
LIMIT 0, 10
关于MySQL Unknown column on 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17203393/