Здравствуйте. Стоит задача построить запрос, но самостоятельно у меня это не получается.
Коротко о системе:
В базе хранятся шахматные задачи, у каждой из которых есть время решения.
Необходимо получить количество первых мест по времени решения для каждого пользователя. (и где 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 занимает чудовищное количество времени).