这个MySQL命令有什么问题?

时间:2011-02-11 18:58:48

标签: mysql

我在MySQL中有以下查询

SELECT  *,(select lat from node where id=node_id)as lat,(select lng from node where id=node_id)as lng from tag,node WHERE 1 limit 5

但我收到此错误消息..

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 

问题是什么?

4 个答案:

答案 0 :(得分:2)

认为你在寻找的是这个。此代码等同于“向我显示标记中的前5行以及相应列'lat'和'lng',其中节点中的node_id等于节点中的node_id”

SELECT tag.*, node.lat, node.lng
FROM tag JOIN node ON tag.node_id=node.node_id
LIMIT 1,5

答案 1 :(得分:2)

您可能想要:

  • 指定一个有效的WHERE子句,它包含一个布尔表达式,或者根本不使用它。
  • 使用完整的字段名称(lat.idlat.node_id?)或其他内容
  • 对表使用唯一别名(您在单个范围内使用两组node两次 - 在子查询中)

通常 - 写一个更全面,更具体的查询,不会产生任何歧义,也不会有麻烦。

  

我想从标签表中检索数据   它有node_id列,而i   想要检索相应的   来自节点表的lat,lng列

SELECT
    tag.*,
    node.lat,
    node.lng
FROM
    tag
JOIN node ON tag.node_id=node.id
LIMIT 5

答案 2 :(得分:1)

尝试:

SELECT  tag.*, node.*,
  (select lat from node where id=node_id)as lat,
  (select lng from node where id=node_id)as lng 
from tag,node 
WHERE 1 limit 5
然而,这将是非常低效的,因为它使用两个相关的子查询而没有JOIN条件。也许你可以解释一下你想要实现的目标,我们可以改进这个查询吗?

答案 3 :(得分:1)

好的,有很多糟糕的编码技术,我不知道从哪里开始。

首先,你的意思是交叉连接,因为这就是你所拥有的。在编写sql代码时使用隐式连接是一种非常糟糕的做法。 IT导致错误,维护起来更难。您不会编写在1992年被替换为更好的C#或Java代码吗?

选择*是一个非常糟糕的选择。始终明确定义所需的列。

你在WHERE 1中获得什么?这没有意义。

通常相关的子查询很糟糕。你为什么不只是做一个内连接,然后选择字段?