2011-02-11 80 views
0

我已经在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 

有什么问题?

+1

错误消息与您发布的代码不符。 SQL语句中没有````,但错误消息指的是单引号。此外,您正在'标签'和'节点'之间创建笛卡尔产品。你确定你想要吗?为什么你用愚蠢的`WHERE 1`? – 2011-02-11 19:03:09

+0

@a_horse_with_no_name:这些单引号是MySQL错误消息的默认部分。尝试运行`SELECT * FROM;` – Mchl 2011-02-11 19:07:23

回答

2

你可能想:

  • 指定一个有效的WHERE子句,它将包含一个布尔表达式,或根本不使用它。
  • 使用完整的字段名(lat.idlat.node_id?)什么
  • 使用唯一的别名表(您正在使用2套不同的node在一个范围的两倍 - 子查询中)

一般 - 编写一个更全面,更具体的查询,这样就不会出现含糊不清的问题。

我想从那里已经NODE_ID列标签表 检索数据,我 要获取相应的 纬度,从节点表LNG列

SELECT 
    tag.*, 
    node.lat, 
    node.lng 
FROM 
    tag 
JOIN node ON tag.node_id=node.id 
LIMIT 5 
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

尝试:

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条件。也许你可以解释你想实现什么,我们可以改进这个查询?

1

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

首先,你的意思是交叉加入,因为你有。在编写sql代码时使用隐式连接是非常糟糕的做法。 IT导致错误,维护起来更困难。你不会在1992年写出更好的C#或Java代码吗?

select *是一个非常糟糕的选择。总是明确地定义你需要的列。

你打算和WHERE 1打交道?这没有意义。

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