2013-05-28 55 views
1

是否可以從這個SQL中刪除子查詢?我需要通過「比賽對陣」得分來排序,但顯然不能通過別名來排序。將SQL子查詢重寫爲JOIN?

SELECT * 
FROM 
    (SELECT b.shortDesc, 
      b.img, 
      sm.uri, 
      match(`bodyCopy`, `shortDesc`) against ('Storage' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION) AS score 
    FROM `blog` b 
    JOIN `sitemap` sm ON sm.id = b.pageId 
    WHERE 'Active' IN (b.status, sm.status) 
) t1 
WHERE score > 0 
ORDER BY score DESC 
+0

一目瞭然,使用HAVING子句可能會工作。我需要確定您的模式轉儲。 –

回答

4

可以擺脫的子查詢:

SELECT b.shortDesc, 
     b.img, 
     sm.uri, 
     match(`bodyCopy`, `shortDesc`) against ('Storage' IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION) AS score 
FROM `blog` b 
JOIN `sitemap` sm ON sm.id = b.pageId 
WHERE 'Active' IN (b.status, sm.status) 
HAVING score > 0 
ORDER BY score DESC 

score值計算出結果之前是未知的。這意味着它不能在WHERE條款中使用。相反,它可以用於HAVING。最後應用ORDER,這裏可以使用score

文檔:SELECT(也可用於HAVINGORDER

+0

所以「score」可以在HAVING和ORDER BY中,但不是在哪裏? – keyboardSmasher

+1

我用一個解釋更新了我的答案。 – Jocelyn

+0

謝謝。這些年來我仍然是一個SQL noob。 :) – keyboardSmasher

0

這裏:

SELECT b.shortDesc, 
     b.img, 
     sm.uri, 
     match(`bodyCopy`, `shortDesc`) against ('Storage' IN NATURAL LANGUAGE MODE WITH 
     QUERY EXPANSION) AS score 
     FROM `blog` b 
    JOIN `sitemap` sm ON sm.id = b.pageId 
    WHERE 'Active' IN (b.status, sm.status) and score > 0 
    ORDER BY score DESC 
+0

謝謝,但你的答案失敗。這就是我創建子查詢的原因:'where子句'中的未知列'score' – keyboardSmasher