Ответы пользователя по тегу MySQL
  • Как спроектировать базу данных?

    @hail3b
    Во первых вам нужнно научиться задавать вопросы а вернее их форматировать, в вашем вопросе нечитабельна структура таблиц.
    Во вторых литературы полно в сети выбирай самую свежую и вперед. Техническую литературу не нужно читать последовательно если вы с главой знакомы читайте следующую. Индивидуальную книгу под ваш проект не найти в ней всегда будет что-то "лишнее".
    В третьих вам нужно определиться с приоритетом поставленной задачи скорость выполнения или интерес/самообразование. Для новичка и не только это два противоположных друг другу приоритета и план выполнения будет разный. Если это заказ и нужно быстрее сделать, то берите готовый движок и настраиваете для себя. Если вам интересен сам процесс проектировки БД, то делайте все сами. Готовый проект также брать не стоит т.к. в нем нужно разбираться и он покажется вам очень сложный.

    По вашему вопросу:
    В вашей структуре есть ошибка, в каждой таблице есть поле логин а должно быть id ссылка на таблицу логин. Структура БД в вашем случае будет примерно такой:
    -- Пользователи
    CREATE TABLE user AS(
    	id int identity,
    	name varchar(128),
    	pass varchar(128)
    )
    -- Авторизация / сессия
    CREATE TABLE user_session AS(
    	id int identity,
    	user__id int,
    	timestamp datetime
    )
    -- Сообщения
    CREATE TABLE message AS(
    	id int identity,
    	post__id int,
    	user_session__id int,
    	subject varchar(255),
    	text varchar(max)
    )
    -- лайк / дизлайк
    CREATE TABLE message_like AS(
    	id int identity,
    	user_session__id int, -- пользователь кто плюсанул
    	message__id int,
    	value int -- плюс 1 / минус 1
    )
    Ответ написан
    Комментировать
  • Составить запрос для получения таблицы рейтинга

    @hail3b
    У вас рейтинг игроков формируется сортировкой
    winGame, drawGame, allGame
    

    кажется это самый простой и правильный метод, но это не так.
    Не простой потому, как сортировка это очень ресурсоёмкая задача.
    А не правильный потому, как из двух игроков:
    23 usr, 1 winGame, 0 drawGame, 50 drawGame
    24 usr, 0 winGame, 10 drawGame, 10 drawGame
    предпочтения отдается первому 23 usr, хотя второй явно играет лучше.

    Мне кажется, что лучше сделать подсчет рейтинга/очков/баллов, т.е. если у вас три параметра определяющие рейтинг winGame, drawGame, allGame, то им просто можно назначить коэффициенты значимости. К примеру winGame*3, drawGame*2, allGame*1, а потом уже отсортировать по баллам.

    select *, (t2.winGame*3 + t2.drawGame*2 + t2.allGame*1) rating
    from(
    SELECT
    temp.userId as userId,
    SUM(CASE WHEN temp.resultGame IS NOT NULL THEN 1 ELSE 0 END) as allGame,
    SUM(CASE WHEN temp.resultGame = 3  THEN 1 ELSE 0 END) as winGame,
    SUM(CASE WHEN temp.resultGame in(2,4,5,6) THEN 1 ELSE 0 END) as drawGame,
    SUM(CASE WHEN temp.resultGame = 1  THEN 1 ELSE 0 END) as loseGame,
    SUM(CASE WHEN temp.resultGame = 0  THEN 1 ELSE 0 END) as startGame,
    SUM(CASE WHEN temp.resultGame=3 AND UNIX_TIMESTAMP(temp.timeStart)>=UNIX_TIMESTAMP(CURDATE()) THEN 1 ELSE 0 END) as countNewWinGame,
    SUM(CASE WHEN temp.resultGame in(2,4,5,6) AND UNIX_TIMESTAMP(temp.timeStart)>=UNIX_TIMESTAMP(CURDATE()) THEN 1 ELSE 0 END) as countNewDrawGame,
    SUM(CASE WHEN UNIX_TIMESTAMP(temp.timeStart)>=UNIX_TIMESTAMP(CURDATE()) AND temp.numberMove>3 THEN 1 ELSE 0 END) as countNewAllGame,
    SUM(temp.timeUser+temp.timeUI) as sumTimeGame
    
    FROM `chess_historyui` temp
    GROUP BY temp.userId
    ) t2
    ORDER BY rating DESC
    
    Ответ написан