我目前正在尝试创建一个粗略的排名/排序查询,该查询将根据用户提交的数据“评分”用户。
在“角色/位置”字段中只有“总统”一次的人将获得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作为基础。
答案 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