В SQL, GQL или JDOQL, как я могу запросить строку с самым высоким значением в 2 столбцах (с самой низкой разницей)? - PullRequest
1 голос
/ 17 февраля 2011

Скажем, например, у меня есть таблица:

Table: Message
| data | likes | dislikes |

Как мне эффективно найти строку, которая имеет наибольшее количество лайков и антипатий, т.е.Так что для следующего примера:

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

Будет выбран «Hello».

Любая помощь будет высоко оценена!

Ответы [ 3 ]

2 голосов
/ 17 февраля 2011

GQL (при условии, что вы используете хранилище данных механизма приложений) не сможет выполнить запрос на вычисление.

Вам необходимо добавить другое свойство в вашу модель (например, под названием «противоречие»).), и вычисляйте его каждый раз, когда вы меняете количество лайков или антипатий.Затем вы можете выполнить простой запрос для этого другого свойства (то есть в порядке убывания, а затем получить первые N записей).

1 голос
/ 17 февраля 2011

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)
0 голосов
/ 17 февраля 2011
select top 1 (likes+dislikes ) as sumOfLikesDislikes from Message 
order by sumOfLikesDislikes desc

Как предлагает Никита, вы можете использовать (любит * не нравится) как LikesTimesDislikes (для метрик), если хотите.

Вы можете даже сделать оба:

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

(Сначала по сумме, затем по метрике)

...