SQL查询没有从sum()返回正确的数字

时间:2014-03-02 15:49:43

标签: php mysql 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个,而“%副百分比”和“总统”的人在其总和(相关性)值中应该有150个。对于有两个“总统”和两个“%副百分比”的人来说,它也不会超过150。有人能指出我做错了什么吗?

我在SQL和网页设计方面有很多东西需要学习,这就是为什么我要求帮助确定我在查询中出错的地方。我的查询基于此this guide作为基础。

1 个答案:

答案 0 :(得分: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