Позволяет делать это шаг за шагом:
Сначала получите список описаний интересующих вас с идентификатором из вашей таблицы:
SELECT
MAX(score) as max_score,
MAX(id) as last_id,
description
FROM
datafeeds
WHERE
device_id = 1
GROUP BY
description
ORDER BY
MAX(score) DESC
LIMIT 10;
Теперь у вас есть список описаний, позволяет захватить все столбцы для них:
SELECT
*
FROM
datafeeds
WHERE
id IN (
SELECT
MAX(id) as last_id
FROM
datafeeds
WHERE
device_id = 1
GROUP BY
description
ORDER BY
MAX(score) DESC
LIMIT 10
);
Этот запрос может дать вам ошибку, в которой говорится, что LIMIT
не поддерживается ...
хак, как это может помочь:
SELECT
*
FROM
datafeeds
WHERE
id IN (
SELECT last_id FROM (
SELECT
MAX(id) as last_id
FROM
datafeeds
WHERE
device_id = 1
GROUP BY
description
ORDER BY
MAX(score) DESC
LIMIT 10
) AS X
);
Или присоединиться к подзапросу
SELECT
*
FROM
(
SELECT last_id FROM (
SELECT
MAX(id) as last_id
FROM
datafeeds
WHERE
device_id = 1
GROUP BY
description
ORDER BY
MAX(score) DESC
LIMIT 10
) X
INNER JOIN datafeeds DF
ON X.last_id = DF.id
;
Индекс на description
колонки может помочь, или вы можете создать индекс покрытия, используя следующие поля : description
, device_id
, score
, id
.
Вы можете получить лучшие результаты, если используете score
или device_id
в качестве первого столбца в индексе. Это зависит от данных, которых мы не знаем.
Пожалуйста, обратите внимание, что
- группировки на
text
колонке медленно и будет медленным, даже с индексами
- индекс на
text
колонке будет почти в два раза требования к хранению таблицы
Здесь важна laravel? Какова ваша цель с этим запросом? Каковы ваши текущие показатели? Ваш запрос медленный, потому что второе условие не имеет смысла, но MySQL рад рассчитать его для вас. (Ну, он в основном отфильтровывает все значения «NULL», но не 'IS NULL' /' IS NOT NULL' лучший способ сделать это?) – Pred
В настоящее время нет индексов, im в момент их добавления. Второе условие было использовано для возврата только уникальных значений из поля описания. Когда просто используйте 'GROUP BY description' вместо' AND description IN ( SELECT описание FROM datafeeds GROUP BY description) 'его очень медленно. – zetdeq
Хорошо, но в чем проблема. Каким должен быть этот запрос?Вы отправили нам запрос без информации об окружающей среде, и это цель. Покажите некоторые усилия, опишите свою проблему (нет, запрос медленный, это не ваша проблема с корнем). Как вы думаете, почему любые индексы будут решать любые проблемы, связанные с скоростью? В некоторых случаях они могут замедлять запросы. Итак, отступите, перефразируйте свой вопрос и задайте нам правильный вопрос. (Отмечено, что неясно, что вы спрашиваете). – Pred