Mysql 子查询别名后不断出现语法错误(发生在不同的查询中)

Mysql 子查询别名后不断出现语法错误(发生在不同的查询中),mysql,syntax-error,Mysql,Syntax Error,对于MySQL,这可能是我无法理解的,但在浪费了一天时间研究StackOverflow的相关问题而没有解决问题后,我决定问一下 SELECT users.idUser, users.name, categoryName FROM users LEFT JOIN ( SELECT `translation` as categoryName FROM localization, usercategories WHERE localization.`string` =

对于MySQL,这可能是我无法理解的,但在浪费了一天时间研究StackOverflow的相关问题而没有解决问题后,我决定问一下

SELECT users.idUser, users.name, categoryName
FROM users 
LEFT JOIN (
  SELECT `translation` as categoryName 
  FROM localization, 
       usercategories 
  WHERE localization.`string` = usercategories.name 
  AND usercategories.idUserCategory = users.idUserCategory
  ) 
  as Something
WHERE users.idUser != 1 
ORDER BY users.name ASC
无论我今天尝试的哪个查询包含子查询,我都会在几乎相同的位置得到相同的语法错误:在本例中,就在子查询的别名之后

1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解在“WHERE users.idUser!”附近使用的正确语法1按用户订购。名称ASC限制0,第11行30'


您可以重新组织查询,使其不需要子查询。这还允许您从任何表中向select添加更多列。而且,它更正确

SELECT 
    users.idUser, 
    users.name, 
    localization.`translation` as categoryName
FROM users 
LEFT JOIN usercategories ON usercategories.idUserCategory = users.idUserCategory
LEFT JOIN localization ON localization.`string`= usercategories.name 
WHERE users.idUser <> 1 
ORDER BY users.name ASC

这里的问题是您缺少join的ON子句。您需要选择一个条件将两个表连接在一起,如下所示:

SELECT stuff
FROM stuff
LEFT JOIN (other stuff)
ON stuff.something = otherstuff.something. // Add here.

您的联接条件是非ANSI的,并且没有ON子句。。。也许这就是原因?试试这个,再优化一点:

SELECT Usr.idUser AS idUser
  ,Usr.name AS name
  ,UsrCat.translation AS categoryName
FROM users AS Usr
LEFT OUTER JOIN usercategories AS UsrCat
  ON UsrCat.idUserCategory = Usr.idUserCategory
LEFT OUTER JOIN localization AS Lcl
  ON Lcl.string = UsrCat.name
WHERE Usr.idUser <> 1
ORDER BY Usr.name ASC

不需要子查询,性能应该很好。

您缺少一个on子句。哇,这太明显了。。。抱歉,伙计们问了个愚蠢的问题。它起作用了。谢谢。这不是一个愚蠢的问题,它可能发生在任何人身上。也许他们否决了,因为这太宽泛了,但我认为@JeffNoel会理解我想说的话。我没有想过这样写这个问题。读起来容易多了。非常感谢。从OP尝试中的语法错误中,我完全忘记了ON clausepart。在派生表上进行连接从根本上说是不正确的。我会避免使用子查询,并使用连接,如@Plant和我所示-它更灵活、可读性更强。@MartinSmith我建议它不太灵活、不太标准,可读性和可维护性较差。但这只是我的观点。@Donal你的重写可能会改变语义。OP最初查询左连接到虚拟两表连接的结果,这并不总是与左连接到两个表独立的结果相同。