2013-12-10 4 views
0

Я пытаюсь получить таблицу вернулась с «взвешенным счетом» с формулой, я предназначенной для каждого типа по следующей схеме:Как получить список «баллов» для каждого типа из SQL-запроса?

любимый: USERID, drinkName

история: идентификатор пользователя, drinkName

напиток: имя, схема проезда, тип

пьяница: idNum, идентификатор пользователя, пароль

Пусть каждый напиток в истории стоит 0,666 очков, и каждый напиток в любимой стоит 1 пои нт.

поэтому каждый раз, когда говорят, что напиток с видом водки появляется в истории, 0.666 следует добавить к числителю для определенного идентификатора пользователя. И 1 балл для фаворитов водки. Затем его следует разделить на общее количество напитков, которое имеет идентификатор пользователя в обоих фаворитах и ​​истории.

Так, например, у меня есть 3 водок в истории и 2 в избранном, она должна быть: (3 (0,666) +2)/5

И запрос должен возвращать это для всех «типов» Напитки у меня есть с величайшим на вершине.

я в настоящее время этот вопрос:

SELECT (
(SELECT COUNT(*) 
    FROM Drink D JOIN History H ON H.drinkName = D.name 
    WHERE type = 'vodka' AND userID = 'sai') 
+ 
(((SELECT COUNT(*) 
    FROM Drink D JOIN Favorite F ON F.drinkName = D.name 
    WHERE type = 'vodka' AND userID = 'sai'))*0.666)) 
/ 
((SELECT COUNT(*) FROM History WHERE userID = 'sai') 
+ 
(SELECT COUNT(*) FROM Favorite WHERE userID = 'sai')) 

Однако это только возвращает для определенного типа напитка, но не таблицы каждого типа напитка.

+0

Вы помечены как MySQL и SQL-сервер ... который один это? – dazedandconfused

+0

извините, что это было случайно, его единственный mysql – user2981811

+0

Рассмотрите возможность предоставления надлежащих DDL (и/или sqlfiddle) ВМЕСТЕ С ЖЕСТКОЙ РЕЗУЛЬТАТОМ – Strawberry

ответ

1

Используйте GROUP BY вместе с функциями агрегации для получения итогов каждого типа.

SELECT type, SUM(numerator)/SUM(denominator) score 
FROM (
    SELECT type, COUNT(*) numerator, COUNT(*) denominator 
    FROM History 
    WHERE userID = "sai" 
    GROUP BY type 
    UNION ALL 
    SELECT type, (COUNT(*) * 0.666) numerator, COUNT(*) denominator 
    FROM Favorites 
    WHERE userID = "sai" 
    GROUP BY type 
) u 
GROUP BY type 
0

Я думаю, что у вас есть проблема с схемой. Кажется, что нет необходимости отслеживать историю употребления алкоголя в двух разных таблицах на основе того, был ли пользователь отмечен как избранный или нет. Я бы подумал, что история с напитками должна отслеживать все напитки независимо от того, являются ли они фаворитами или нет, а в избранных должно указываться только то, что напитки - это то, что человек в настоящее время помечен как любимый.

Так что, ваш пример 5 пить раньше, я бы сказал, ваши таблицы может выглядеть следующим образом:

истории

userId drinkName someTimeField 
sai vodka  2013-12-09 12:30:53 
sai tequila 2013-12-09 12:31:23 
sai rum  2013-12-09 12:31:53 
sai vodka  2013-12-09 12:32:23 
sai beer  2013-12-09 12:32:53 

Так рядом зная, что Саи может иметь проблемы с алкоголем (потому что вы знаете, когда он был его напитки) у вас есть полный histroy, что он dranks независимо, чтобы были ли напитки «любимые»

любимые

userId drinkNane 
sai  vodka 
sai  everclear 

Теперь вы просто один легко присоединиться, чтобы получить свой расчет:

SELECT 
    SUM(CASE WHEN f.drinkName IS NOT NULL THEN 1 ELSE 0.66 END CASE) 
    /SUM(1) AS `value` 
FROM drinker AS d 
LEFT JOIN history AS h 
    ON d.userId = h.userId 
LEFT JOIN favorite AS f 
    ON h.userId = f.userId AND h.drinkName = f.drinkName 
WHERE d.drinker = ? 
GROUP BY d.drinker 
Смежные вопросы