2012-02-10 3 views
-1

Итак, я знаю, что есть другие вопросы. Но у меня это немного по-другому ...5 звездная система оценки mysql setup

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

так, Я не хочу иметь 2 таблицы «игры» и «games_ratings», потому что тогда я не могу сделать простой

SELECT id, name, howtoplay, otherinfo, avrating FROM games ORDER BY id; 

было бы хорошо, если есть умный способ, которым я мог бы иметь систему рейтинга 5 звезд, которая помнит пользователей и может отображать среднее значение всего в 1 таблице вместе с информацией.

Я не знаю многого о границах mysql. Должен ли я просто запустить сразу два запроса? Ive всегда пытался ограничить каждую страницу только одним запросом. особенно если мой первый запрос будет загружать 50 игр для отображения информации.

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

+0

С системой, которую вы предлагаете, как вы узнаете, если пользователь уже оценил игру? Или как они смогут изменить свой рейтинг? – Tim

+0

хорошо, о котором я сказал, что им известно (что требует 2 таблицы), пользовательский идентификатор хранится с их голосом, но im спрашивает, знает ли кто-нибудь больше о mysql, чем я, и может предложить способ сделать это в другой таблице. Вероятно, is not, но идентификатор цифры ask. – brybam

+0

Попробуйте уточнить свой вопрос немного больше. Я думаю, вы, возможно, не совсем четко определили свой конечный результат. Взгляните на образцы ниже и попробуйте их. Сообщите нам свои проблемы. –

ответ

4

Я собираюсь выйти на конечность здесь, поскольку я думаю, что вы можете быть не только новичком в mysql, но и немного новым для моделирования.

Я бы порекомендовал 3 таблицы для этой идеи.

  1. Пользователи Таблица
  2. UserRatings Таблица
  3. Игры Таблица

таблица пользователей используется для хранения только что. Информация о пользователе. Возможно, имя пользователя, пароль, имя, фамилия, например. В таблице должен быть первичный ключ. Вызовите его UserID. Он должен автоматически увеличивать себя и быть уникальным для каждой строки.

Таблица игр следующая. Поместите в него название игры. Он также должен иметь первичный ключ. Назовите это GameID.

И, наконец, таблица UserRatings. Я являюсь фанатом первичных ключей по составным клавишам даже в таблицах ассоциативного типа, но вы также можете пойти по этому маршруту. Скажите UserRatingsId, Rating, InsertTimeStamp, UpdateTimeStamp.

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

Также присоединяется ваш друг. Сделайте немного чтения на них. Игнорируйте внешний, внутренний, крест, левый, правый и т. Д., Пока не познакомитесь с понятием простого прямого соединения (и его называют многими вещами).

Попробуйте некоторые из приведенных выше ответов и этого. Я предполагаю, что ваши вопросы будут гораздо более целенаправленными, когда вы начнете играть с ним.

Приветствия

Matt

+0

На самом деле я не рекомендую хранить среднюю оценку как отдельное поле. OP должен будет выполнить большую работу, чтобы обеспечить согласованность данных в этом случае - например, добавление нескольких триггеров в UserRatings вставить/обновить/удалить и т. Д. Все остальные точки полезны, поэтому +1 –

+0

Да, есть много способов его сохранить. Он не указывает на необходимость чего-то более сложного, но тонкие ответы. Спасибо за +1 –

0

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

Предположим, у вас есть отдельные таблицы для информации о играх и для оценок (да, подход вам не нравится :)). Что-то вроде этого:

CREATE TABLE games(id INT AUTO_INCREMENT, name VARCHAR(255), howtoplay TEXT, otherinfo TEXT); 

CREATE TABLE ratings(game_id INT, user_id INT, rating INT); 

Затем вы можете сделать следующее:

CREATE VIEW games_with_ratings AS SELECT id, name, otherinfo, howtoplay, AVG(rating) AS avrating FROM games LEFT JOIN ratings ON games.id=ratings.game_id GROUP BY id; 

Вы должны сделать это только один раз, и после этого вы сможете запросить этот вид так же, как вы хотите в вашем оригинале вопрос:

SELECT id, name, howtoplay, otherinfo, avrating FROM games_with_ratings ORDER BY id; 
+0

Я действительно не знаю много о mysql. просто основы, возможно, несколько функций, лимиты ect. im не уверен, что вы подразумеваете под «представлением», было бы неправильно запускать 2 варианта запросов в моей php-функции. это нормально? У меня действительно нет понятия о том, что будет слишком много. Я всегда старался делать по одному запросу за раз. – brybam

+0

Обновлен мой ответ. –

+0

oohhh, поэтому представление - это способ запросить информацию из двух таблиц сразу ... поэтому я могу просто сделать 1 запрос, как я сказал ...? – brybam

0

Вы можете сохранить среднее значение и общее количество в таблице games. Когда вы добавляете новый рейтинг:

UPDATE games SET 
    average=((average*totalvotes)+{$votescore})/(totalvotes+1), 
    totalvotes=totalvotes+1 
WHERE id={$id} 

Это намного эффективнее, чем пересчет среднего значения каждый раз.

Однако, чтобы вспомнить, кто голосовал на то, что, лучший способ это таблица (userid, gameid, score) сохраненным как InnoDB таблицы.

+0

как бы получить информацию из моих «games_ratings» в среднем столбце в таблице «игр»? после того, как я сделаю «вставку» в таблицу «рейтинги игр» ... должен ли mysql вернуть новый средний результат, а затем запустить обновление в играх? – brybam

+0

У вас нет. Вы добавляете столбцы 'average' и' totalvotes' в таблицу 'games', оба по умолчанию равны 0, а затем пусть код выше выполняет работу, когда дело доходит до голосования. –

1

Вы сказали:

было бы хорошо, если есть умный способ, которым я мог бы иметь систему рейтинга 5 звезд, которая помнит пользователей и может отображать в среднем значение все в 1 таблице вместе с информацией.

У вас уже есть таблица пользователей. Единственный способ «запомнить» пользователя, голосовавшего за игру, - это FK для идентификатора пользователя. Теперь, если у вас есть одна таблица смешивания пользователей и игр, то ваша таблица будет недоставать нормализации и будет иметь вид:

+--------+----------------+------------------------+--------+------+ 
| GameId | GameName | GameDescription  | User | Vote | 
+--------+----------------+------------------------+--------+------+ 
|  1 | Counter Strike | An addicting FPS game! | Timmy | 3 | 
|  1 | Counter Strike | An addicting FPS game! | Martin | 5 | 
|  1 | Counter Strike | An addicting FPS game! | Moe | 2 | 
|  2 | Halo   | Other addicting game | Timmy | 2 | 
|  2 | Halo   | Other addicting game | Sonny | 2 | 
+--------+----------------+------------------------+--------+------+ 

И это не очень нормализуется ... На самом деле, ты собираешься иметь GameDescription и GameName повторен везде! В этом случае ваш ПК будет GameId и User. Вы пожалеете об этом рано или поздно. Итак, давайте не будем этого делать. Перейти на это:

Игры (PK: GameID)

+--------+----------------+------------------------+ 
| GameId | GameName | GameDescription  | 
+--------+----------------+------------------------+ 
|  1 | Counter Strike | An addicting FPS game! | 
|  2 | Halo   | Other addicting game | 
+--------+----------------+------------------------+ 

Пользователи (PK: Пользователь)

+--------+ 
| User | 
+--------+ 
| Timmy | 
| Martin | 
| Moe | 
+--------+ 

Голосов (PK: GameID и пользователя)

+--------+--------+------+ 
| GameId | User | Vote | 
+--------+--------+------+ 
|  1 | Timmy | 3 | 
|  1 | Martin | 5 | 
|  1 | Moe | 2 | 
|  2 | Timmy | 2 | 
|  2 | Sonny | 2 | 
+--------+--------+------+ 

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

Я знаю, что присоединяется, но они помогут вам больше, чем они причинят вам боль.

Теперь, как вы можете улучшить средний расчет? Ну, для каждой игры у вас может быть еще один столбец, такой как TotalVotes, который будет содержать общее количество голосов и другой столбец SumVotes, который будет содержать сумму всех голосов за эту игру. Таким образом, когда число голосов увеличивается на один столбец TotalVotes, и вы добавляете в SumVotes количество запусков, которые пользователь назначил игре.

Затем, чтобы отобразить среднее, просто выполнить разделение обоих значений (это гораздо быстрее, чем соединения и просмотра таблиц пересчитывать это.

Ну, я надеюсь, что это помогает или направлять вас к лучшему решению Удачи!

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