2011-02-11 81 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打交道?這沒有意義。

和通常相關的子查詢是不好的。爲什麼你不只是做一個內部連接,然後選擇字段?