2010-02-19 82 views
5

以下查詢在MySQL 5.x中運行良好MySQL的左連接的子查詢失敗

SELECT 
    m_area.id, m_area.cn_areaName, m_area.de_areaName, 
    m_area.en_areaName,m_area.jp_areaName,t_shop.count 
FROM 
    m_area left join 
(
select t_shop.areaID, count(areaID) AS count 
from t_shop 
group by t_shop.areaID 
) t_shop 
on m_area.id = t_shop.areaID 

然而,當我必須在4.0.23 MySQL數據庫具有相同的結構數據庫,它只是返回下面的消息數據運行:

1064 - 您的SQL語法錯誤。檢查對應於你的MySQL服務器版本使用附近的正確語法手冊「[

  select t_shop.areaID, count(areaID) AS count 
      from t_s 

我試過很多次,但還是失敗了。是否加入MySQL 4.x中不允許的子查詢?那意味着我必須用臨時表來完成它?

在此先感謝!

回答

1

冒了出來 「計數(areaID表示)AS計數」

子查詢的多列被搞亂的加入。

臨時表應該可以正常工作....

玩得開心!

+0

你是對的我只能用temp選項卡做 DROP TEMPORARY TABLE IF EXISTS temp_shop; CREATE TEMPORARY TABLE temp_shop(areaID int(11),count int(11)); INSERT INTO temp_shop select t_shop。areaID表示,從由t_shop.areaID t_shop \t \t \t \t組計數(areaID表示)AS計數 \t \t \t \t; 選擇 \t \t \t \t m_area.id,m_area.cn_areaName,m_area.de_areaName, \t \t \t \t m_area.en_areaName,m_area.jp_areaName,temp_shop.count \t \t \t \t FROM \t \t \t \t m_area左連接temp_shop \t \t \t \t on m_area.id = temp_shop.areaID; 有時我們必須編寫一些舊機器,這是非常痛苦的。 – 2010-02-19 19:09:01

1

我唯一能想到的就是將表名添加到子查詢中的areaID中,或者將保留字count重命名爲cnt。

SELECT m_area.id 
     , m_area.cn_areaName 
     , m_area.de_areaName 
     , m_area.en_areaName 
     ,m_area.jp_areaName 
     ,t_shop.cnt 
FROM  m_area 
     left join ( 
      select  t_shop.areaID 
        , count(t_shop.areaID) AS cnt 
      from  t_shop 
      group by t_shop.areaID 
     ) t_shop on m_area.id = t_shop.areaID 
+0

thx爲您的評論,但它仍然失敗 – 2010-02-19 19:07:05

4

子查詢是相當不能很好地支持與MySQL 4.0:它成爲可以使用它們(至少,在一些真正的,有用的方法)與MySQL 4.1 - 和MySQL 4.0是真的老了,現在。 ..


例如見這個頁面的MySQL手冊:12.2.8. Subquery Syntax(引用,重點煤礦)

從MySQL 4.1開始,支持SQL標準所需的所有子查詢形式和操作, 以及一些特定於MySQL的特定 。

隨着版本的MySQL 4.1之前,它 必要變通或 避免使用子查詢的。
在 很多情況下,子查詢可以使用連接 和其他方法成功地重寫 。見Section 12.2.8.11, 「Rewriting Subqueries as Joins for Earlier MySQL Versions」

+0

你提供的基本意義的鏈接說,OP做的是解決你提到的問題?! – 2010-02-19 18:13:53