2016-04-07 9 views
0

У меня есть главный стол «Рестораны» и отношение «один ко многим» к таблице «RestaurantVotes». Один ресторан может иметь несколько голосов. Он определяется следующим образом:SQL-Statement для подсчета и вычисления реляционных данных

CREATE TABLE `restaurant_votes` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `created_at` datetime NOT NULL, 
    `user_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `cat_food` int(11) NOT NULL, 
    `cat_cart` int(11) NOT NULL, 
    `cat_ambassador` int(11) NOT NULL, 
    `cat_drinks` int(11) NOT NULL, 
    `cat_service` int(11) NOT NULL, 
    `cat_ambience` int(11) NOT NULL, 
    `cat_price` int(11) NOT NULL, 
    `restaurant_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `IDX_1B96C91EB1E7706E` (`restaurant_id`), 
    CONSTRAINT `FK_1B96C91EB1E7706E` FOREIGN KEY (`restaurant_id`) REFERENCES `restaurants` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE `restaurants` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `created_at` datetime NOT NULL, 
    `updated_at` datetime NOT NULL, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

Для API-вызова, мы должны получить все рестораны, включая имя и общий рейтинг для этого ресторана в ответ JSON. Название и т. Д. Не проблема, но у нас есть большие проблемы, чтобы найти SQL-запрос, который получает рейтинг для каждого ресторана. Оценка рассчитывается следующим образом:

  1. Остановить значения (целое число 1-5) всех категорий (cat_ *) и разделить их на количество категорий (7).
  2. Остановите результат оценок выше и разделите значение на количество оценок в таблице restaurant_votes за ресторан.
  3. Возвратите общий рейтинг от 2. в SQL-запросе вместе с названием ресторана.

Возможно ли это, используя SQL? Любой совет? Благодаря!

+0

Ну, что вы пробовали? – OldProgrammer

+0

Вам нужно иметь его в одном заявлении? Какой язык сценариев используется для создания JSON или ваш SQL-сервер, предоставляющий ответы JSON напрямую? – LuvnJesus

+0

Ничего в сыром SQL. Мы используем структуру symfony2 для нашего webapp и использовали включенный QueryBuilder. Но мы не можем получить доступ к настраиваемому свойству для вычисления рейтинга в QueryBuilder. Набор данных состоит из ~ 5000 записей, поэтому из-за проблем с производительностью необходимо исключить многие поля из таблицы ресторанов (я удалил большинство полей в sql выше). И именно по этой причине мы просто не можем использовать готовые функции, такие как findAll() и т. Д. – Tronic

ответ

1
select 
r.name, 
sum(rv.cat_food + 
    rv.cat_cart + 
    rv.cat_ambassador + 
    rv.cat_drinks + 
    rv.cat_service + 
    rv.cat_ambience + 
    rv.cat_price)/7 as total_score, 
sum(rv.cat_food + 
    rv.cat_cart + 
    rv.cat_ambassador + 
    rv.cat_drinks + 
    rv.cat_service + 
    rv.cat_ambience + 
    rv.cat_price)/7/count(rv.id) as average_score 
from restaurants r 
left join restaurant_votes rv 
    on r.id = rv.restaurant_id 
group by r.name 

Я отправил SQLFiddle, чтобы продемонстрировать это.

+0

СПАСИБО. работает как ожидалось! – Tronic

1
SELECT r.name,r.id,score.rating 
FROM 
restaurants as r 
INNER JOIN 
(
SELECT restaurant_id,AVG(cat_food + cat_cart + cat_ambassador + cat_drinks + cat_service + cat_ambience + cat_price)/7 AS rating 
FROM restaurant_votes 
GROUP BY restaurant_id 
)as score 
ON r.id = score.rating 

Будет ли это работать? Он получает все рестораны, определенные в ресторане стол и и получает среднее значение всех столбцов суммируются и деленная на 7.

+0

Выберите другое решение. Благодарю. Но вы заставляете голосовать за это. – Tronic

 Смежные вопросы

  • Нет связанных вопросов^_^