由於SQL語法無效,MySQL正在返回錯誤。
開幕式不平衡。引用「第18行」和「at 30'」很可能是由於MySQL解析器讀取了過去什麼你認爲是語句的結尾,並且進一步閱讀,尋找有效的語法來解析。
在問題中發佈的SQL是難以理解的混亂。 (它看起來就像是沒有計劃放在一起;糖化SQL構建在一起,希望這樣它會返回一些有用的東西。)
這並不完全清楚,我們期望返回什麼結果。沒有這些,就不可能提供更多具體的援助。如果沒有示例數據和預期結果,我們正在盲目猜測我們正試圖實現的目標。
編輯
的問題已被編輯。在SQL中,所有對countries
表的引用都被替換爲對sports
的引用。
至少現在有一些(相當模糊)所需行爲的描述。
獲取sports
表中所有行的mytag
,mytag2
和mytag3
列中的值列表作爲單個列。然後將該值列表摺疊到不同的列表中,以及標籤出現的次數。應該首先列出出現頻率最高的標籤值。
我們可以這樣做:
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構造應該包含在查詢中的原因,那麼該構造不屬於查詢。
和(再次)...提供例如數據和預期輸出會走很長的路向提供可以理解的規範。這將給我們一種方法來確定查詢中需要的結構,並給出一個參考,以驗證查詢返回預期結果。
沒有這一點,我們只是猜測。
使用聯合,每個查詢必須具有相同的數量和列的類型 –
這是我第一次使用聯合,所以我有點不確定它是如何工作的,也許最好是我不使用它 – Beck
什麼是所有的parens?他們似乎是不平衡的,他們沒有明顯的理由。 – spencer7593