2017-04-19 166 views
-1

當試圖運行此查詢我得到以下信息MySQL的 - 1064 - 你在你的SQL語法錯誤有一個錯誤

#1064 - 你在你的SQL語法錯誤;檢查對應於你的MySQL服務器版本在線路附近使用「30」正確的語法手冊18

我不知道這意味着什麼作爲我的代碼沒有一行18也不具有「 30' 所以我不清楚,爲什麼它說接近‘30’

SELECT * from (SELECT myTag 
FROM (SELECT myTag 
FROM sports) 
UNION ALL 
(SELECT myTag2 myTag 
FROM sports) as sport3 
UNION ALL 
(SELECT myTag3 myTag 
FROM sports) alltags 
GROUP BY myTag) as sport 
ORDER BY COUNT(*)as sport2) 
FROM (SELECT * 
    FROM sports b 
    join sports a 
    on a.myTag = b.Name 
    where a.sportID <> b.sportID and a.myTag2 = 'football' or a.myTag = 'football' or a.myTag3 = 'football') 

Table

我想拿起從myTag,myTag2和MyTag3中最常見的值,然後使用該值,並檢查與名稱列,並且如果這些值中的任何一個匹配,並且他們顯示y來自該行的信息

+0

使用聯合,每個查詢必須具有相同的數量和列的類型 –

+0

這是我第一次使用聯合,所以我有點不確定它是如何工作的,也許最好是我不使用它 – Beck

+0

什麼是所有的parens?他們似乎是不平衡的,他們沒有明顯的理由。 – spencer7593

回答

0

由於SQL語法無效,MySQL正在返回錯誤。

開幕式不平衡。引用「第18行」和「at 30'」很可能是由於MySQL解析器讀取了過去什麼你認爲是語句的結尾,並且進一步閱讀,尋找有效的語法來解析。

在問題中發佈的SQL是難以理解的混亂。 (它看起來就像是沒有計劃放在一起;糖化SQL構建在一起,希望這樣它會返回一些有用的東西。)

這並不完全清楚,我們期望返回什麼結果。沒有這些,就不可能提供更多具體的援助。如果沒有示例數據預期結果,我們正在盲目猜測我們正試圖實現的目標。

編輯

的問題已被編輯。在SQL中,所有對countries表的引用都被替換爲對sports的引用。

至少現在有一些(相當模糊)所需行爲的描述。

獲取sports表中所有行的mytag,mytag2mytag3列中的值列表作爲單個列。然後將該值列表摺疊到不同的列表中,以及標籤出現的次數。應該首先列出出現頻率最高的標籤值。

我們可以這樣做:

SELECT t.mytag AS alltag 
     , COUNT(1) AS cnt 
    FROM (SELECT t1.mytag 
      FROM sports t1 
      UNION ALL 
      SELECT t2.mytag2 
      FROM sports t2 
      UNION ALL 
      SELECT t3.mytag3 
      FROM sports t3 
     ) t 
    GROUP 
    BY t.mytag 
    ORDER 
    BY COUNT(1) DESC 
     , t.mytag DESC 

如果這是不正確的,那麼我們就需要修改該查詢。

該規範的下一部分含混不清......

「使用值和名稱列檢查,並是,如果其中的任何值匹配,如果他們這樣做顯示來自該行的信息」

假設(一會兒)的結果集由以前的查詢返回的是我們想要的,並且可以方便地在名爲c的表中提供。

「用該值與名稱列檢查」,我們可以做這樣的事情:

SELECT c.alltag 
     , c.cnt 
    FROM c 
    JOIN sports s 
    ON s.name = c.alltag 
    ORDER 
    BY c.cnt DESC 
     , c.mytag DESC 

的虛構表中的參考c可以用內嵌視圖替換,結果第一個查詢返回:

SELECT c.alltag 
     , c.cnt 
     , s.sportid 
     , s.name 
     , s.mytag 
     , s.mytag2 
     , s.mytag3 
    FROM ( 
      SELECT t.mytag AS alltag 
       , COUNT(1) AS cnt 
      FROM (SELECT t1.mytag 
        FROM sports t1 
        UNION ALL 
        SELECT t2.mytag2 
        FROM sports t2 
        UNION ALL 
        SELECT t3.mytag3 
        FROM sports t3 
       ) t 
      GROUP 
       BY t.mytag 
      ORDER 
       BY COUNT(1) DESC 
       , t.mytag DESC 
     ) c 
    JOIN sports s 
    ON s.name = c.alltag 
    ORDER 
    BY c.cnt DESC 
     , c.alltag DESC 
     , s.sportid DESC 

該規範並沒有給出任何解釋,或任何指示,sports表的一個自聯接本身是必需的。沒有提及爲什麼我們需要在mytag,mytag2或mytag3中檢查'football'

原始查詢的那一點令人困惑。鑑於沒有提及可能需要的原因,我們省略了自連接和任何其他限制要返回的行的謂詞。

查詢中的所有內容都應該出於某種原因。如果我們無法解釋SQL構造應該包含在查詢中的原因,那麼該構造不屬於查詢。


和(再次)...提供例如數據預期輸出會走很長的路向提供可以理解的規範。這將給我們一種方法來確定查詢中需要的結構,並給出一個參考,以驗證查詢返回預期結果。

沒有這一點,我們只是猜測。

+0

我更新了問題 – Beck

+0

感謝您的幫助:-) – Beck

相關問題