Задать вопрос

Как корректно составить запрос

Здравствуйте. Стоит задача построить запрос, но самостоятельно у меня это не получается.
Коротко о системе:
В базе хранятся шахматные задачи, у каждой из которых есть время решения.
Необходимо получить количество первых мест по времени решения для каждого пользователя. (и где numberTry=0).
Причем запрос должен выдавать только тех пользователей, у которых количество первых мест больше нуля.

есть вот такая таблица, которая хранит данные только о самих решениях:

CREATE TABLE IF NOT EXISTS `chess_storetry` (
  `userId` int(11) NOT NULL, /*id пользователя*/
  `storeId` int(11) NOT NULL, /*id задачи*/
  `numberTry` int(11) NOT NULL, /*номер попытки*/
  `timeStore` int(11) NOT NULL, /*время решения*/
  PRIMARY KEY (`userId`,`storeId`,`numberTry`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


где timeStore это timestamp.

Также можно использовать связанные таблицы:
_users, где храним пользователей (ключ: userId)
_historystore, которая хранит данные о всех попытках решения: завершенных и незавершенных. (составной ключ: (`userId`,`storeId`)).

Мой запрос:
            SELECT
            (
                SELECT
                    SUM(
                        IF(
                        (
                        SELECT MIN(tt2.timeStore)
                        FROM `chess_storetry` tt2
                        WHERE tt2.storeId=tt1.StoreID AND tt2.numberTry=0
                        GROUP BY tt2.storeId
                        )
                        >=
                        (
                        SELECT tt3.timeStore
                        FROM `chess_storetry` tt3
                        WHERE tt3.storeId=tt1.StoreID AND tt3.numberTry=0 AND tt3.userId=tt1.userId
                        )
                        ,1,0)
                    )
                FROM
                    `_historystore` tt1
                WHERE
                    (tt1.finish=1 AND tt1.userId=t1.userId)
            ) as posCount,
            t1.userId as userId
            FROM `_users` t1


В нем проблема состоит в том, что он выдает всех пользователей.
А мне нужно только тех, у которых posCount больше нуля. (Иначе обработка данных в php занимает чудовищное количество времени).
  • Вопрос задан
  • 2947 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
AgentSIB
@AgentSIB
Попробуйте так, если я правильно понял задачу.
SELECT
    cs2.userId,
    count(cs2.storeId) AS count_stores
FROM
    chess_storetry AS cs2,
    (SELECT
        cs.storeId,
        min(cs.timeStore) AS timeStore
    FROM 
        chess_storetry AS cs,
        _historystore AS h
    WHERE
        cs.numberTry = 0 AND h.userId=cs.userId AND h.storeId = cs.storeId AND h.finish=1
    GROUP BY
        storeId) AS results
WHERE
    cs2.numberTry = 0 AND cs2.storeId=results.storeId AND cs2.timeStore = results.timeStore
GROUP BY userId
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sam002
@sam002
Линуксойд, кодер, немного физик.
… GROUP BY userId ORDER BY timeStore DESC LIMIT 100

Не подойдёт?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
23 дек. 2024, в 08:09
10000 руб./за проект
23 дек. 2024, в 04:30
10000 руб./за проект