2012-07-25 85 views
2

我開始使用OpenGeoDB查找郵政編碼和城市名稱。我的MySQL查詢內容是這樣的:MySQL錯誤1242甚至與任何

SELECT  `d`.`text_val` AS `city`, (
    SELECT `text_val` 
    FROM `geodb_textdata` 
    WHERE `loc_id` = ANY (
     SELECT `loc_id` 
     FROM `geodb_textdata` 
     WHERE `text_val` LIKE '08%' 
    ) 
     AND `text_type` = '500300000' 
) AS `plz`, `c`.`lat`, `c`.`lon` 
FROM  `geodb_textdata` AS `d` 
LEFT JOIN `geodb_coordinates` AS `c` USING (`loc_id`) 
WHERE  `loc_id` = ANY (
    SELECT `loc_id` 
    FROM `geodb_textdata` 
    WHERE `text_val` LIKE '08%' 
) 
    AND `text_type` = '500100000' 

如果我運行此查詢採用了全郵政編碼或城市名稱它的偉大工程,但上面的代碼中,我得到的錯誤代碼

#1242 - Subquery returns more than 1 row 

我正在使用Google,我發現,我應該在=和子查詢之間使用ANY。你有什麼想法我可以修復我的代碼?先謝謝你。 :)

+0

+1教我什麼'ANY'!第一次看到它。 :) – 2012-07-25 09:21:34

+0

您是否嘗試過使用IN而不是ANY? – 2012-07-25 09:22:06

+0

如果使用IN,我會得到相同的錯誤。 :/ – anisie 2012-07-25 09:24:17

回答

2

我懷疑這個子查詢返回超過1行:

(
SELECT `text_val` 
FROM `geodb_textdata` 
WHERE `loc_id` = ANY (
    SELECT `loc_id` 
    FROM `geodb_textdata` 
    WHERE `text_val` LIKE '08%' 
) 
    AND `text_type` = '500300000' 
) AS `plz` 

更新:未經測試,但給這個查詢一個嘗試。

SELECT  `d`.`text_val` AS `city`, `d2`.`text_val` AS `plz`, `c`.`lat`, `c`.`lon` 
FROM  `geodb_textdata` AS `d` 
LEFT JOIN `geodb_textdata` AS `d2` USING (`loc_id`) 
LEFT JOIN `geodb_coordinates` AS `c` USING (`loc_id`) 
WHERE  `d`.`text_val` LIKE '08%' AND `d`.`text_type` = '500100000' 
AND   `d2`.`text_val` LIKE '08%' AND `d2`.`text_type` = '500300000' 
+0

是的,因爲有更多以08開頭的郵政編碼。 – anisie 2012-07-25 09:30:07

+0

這是一個問題。爲什麼它是一個子查詢?爲什麼不只是將'text_val'和'WHERE text_val LIKE '08%''添加到主查詢中? – 2012-07-25 09:34:21

+0

這不起作用,因爲OpenGeoDB將郵政編碼和城市名稱存儲在同一列中,名爲text_val。如果我這樣做,我只需要獲得郵政編碼或城市名稱,而且我都需要。 :/我想我需要做兩個查詢。 :/ – anisie 2012-07-25 09:53:46