2014-03-02 27 views
0

我目前正在創建一個粗略的排名/排序查詢,將「分數」用戶可以根據他們提交的數據進行試驗。SQL查詢不返回從和正確的號碼()

有人在角色/位置字段「總統」恰好一次將給予100分,任何以「%副%」(如副總裁)的角色/位置字段將被拿下一半左右給那些只有「總統」的人提供了什麼。

SELECT *, sum(relevance) 
    FROM (
    SELECT a.*, 
       100 AS relevance 
      FROM application a, 
       document d 
     WHERE d.`Role/Position` LIKE 'president' 
       AND d.`AppID` = a.`AppId` 
       AND `AwardID` != 'NULL' 
       AND `Schoolyear` = '2013-2014' 
    UNION 
     SELECT a.*, 
     50 AS relevance 
      FROM application a, 
       document d 
     WHERE d.`Role/Position` LIKE '%vice%' 
       AND d.`AppID` = a.`AppId` 
       AND `AwardID` != 'NULL' 
       AND `Schoolyear` = '2013-2014' 
     ) results 
GROUP BY AppID 
ORDER BY sum(relevance) DESC 

我的問題是,如果我省略工會選擇部分,我可以想出總計200人爲有兩個「總統」字段的人。如果工會選擇部分保留在查詢中,則僅相關性爲100.

有兩個「總統」字段的人應該有200人,而有「%vice%」和「總統」的人會有150據推測它們的總和(相關性)值。對於擁有兩名「總統」和兩名「%犯罪率」的人來說,這一數字也不會超過150。有人能指出我做錯了什麼嗎?

我有很多關於SQL和網頁設計,這就是爲什麼我在確定在何處我已經錯了我的查詢請求幫助學習。我基於這個this guide作爲基礎的查詢。

回答

0

UNION做了DISTINCT,這將消除重複行。由於您希望application中的每行的多個匹配成爲可能,因此you should use UNION ALL instead;

SELECT *, sum(relevance) 
FROM (
    SELECT a.*, 100 AS relevance 
    FROM application a, document d 
    WHERE d.`Role/Position` LIKE 'president' AND d.`AppID` = a.`AppId` 
    AND `AwardID` != 'NULL' AND `Schoolyear` = '2013-2014' 
    UNION ALL 
    SELECT a.*, 50 AS relevance 
    FROM application a, document d 
    WHERE d.`Role/Position` LIKE '%vice%' AND d.`AppID` = a.`AppId` 
    AND `AwardID` != 'NULL' AND `Schoolyear` = '2013-2014' 
) results 
GROUP BY AppID 
ORDER BY SUM(relevance) DESC 
+1

與UNION ALL一起工作正常。謝謝您的幫助! –