在SQL或GQL或JDOQL中,如何查询2列中具有最高值的行(差异最小)?

时间:2011-02-17 00:25:17

标签: sql algorithm google-app-engine jdoql

比方说,我有一张桌子:

Table: Message
| data | likes | dislikes |

我如何有效地找到喜欢和喜欢最多的行,即最有争议的行。因此,对于以下示例:

{("Hello", 10, 5)
("Ola!", 5, 5)
("Ni Hao!", 2, 2)
("Wazzup!", 5, 7)}

将选择“你好”。

任何帮助都将受到高度赞赏!

3 个答案:

答案 0 :(得分:2)

GQL(假设您正在使用应用引擎数据存储区)将无法对计算进行查询。

您需要在模型中添加另一个属性(例如称为“争议”),并在每次更改喜欢或不喜欢的数量时计算它。然后你可以对其他属性做一个简单的查询(即按降序排列,然后获取前N个记录)。

答案 1 :(得分:1)

1)您可能希望使用其他一些指标而不是abs(likes - dislikes)。在这种情况下,(0, 5)(100, 105)同样会引起争议 我认为,likes*dislikes可能适用于您的条件。

2)我不确定jdoql,但是既然你指定了sql标签,那么在标准的sql中,这可以在不进行排序的情况下完成。像

这样的东西
select * from Message 
    where likes*dislikes = (select max(likes*dislikes) from Message)

答案 2 :(得分:0)

select top 1 (likes+dislikes ) as sumOfLikesDislikes from Message 
order by sumOfLikesDislikes desc

根据Nikita的建议,如果你愿意,你可以使用(喜欢*不喜欢)LikesTimesDislikes(用于指标)。

你甚至可以做到这两点:

select top 1 (likes+dislikes ) as sumOfLikesDislikes, 
             (likes*dislikes ) as LikesTimesDislikes  
from Message 
order by sumOfLikesDislikes desc, LikesTimesDislikes   desc

(首先是总和,然后是指标)