2016-05-23 5 views
0

Im Попытка получить 10 результатов на основе наивысшей оценки, где описание уникально.Как получить уникальные значения из 1 поля, возвращающего все поля

Таким образом, эти 10 результатов не должны содержать записи с тем же описанием.

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

`SELECT * FROM datafeeds 
WHERE device_id = 1 
ORDER BY score 
LIMIT 10;` 
+0

Здесь важна laravel? Какова ваша цель с этим запросом? Каковы ваши текущие показатели? Ваш запрос медленный, потому что второе условие не имеет смысла, но MySQL рад рассчитать его для вас. (Ну, он в основном отфильтровывает все значения «NULL», но не 'IS NULL' /' IS NOT NULL' лучший способ сделать это?) – Pred

+0

В настоящее время нет индексов, im в момент их добавления. Второе условие было использовано для возврата только уникальных значений из поля описания. Когда просто используйте 'GROUP BY description' вместо' AND description IN ( SELECT описание FROM datafeeds GROUP BY description) 'его очень медленно. – zetdeq

+0

Хорошо, но в чем проблема. Каким должен быть этот запрос?Вы отправили нам запрос без информации об окружающей среде, и это цель. Покажите некоторые усилия, опишите свою проблему (нет, запрос медленный, это не ваша проблема с корнем). Как вы думаете, почему любые индексы будут решать любые проблемы, связанные с скоростью? В некоторых случаях они могут замедлять запросы. Итак, отступите, перефразируйте свой вопрос и задайте нам правильный вопрос. (Отмечено, что неясно, что вы спрашиваете). – Pred

ответ

-1

Я заметил, что нет необходимости использовать подзапрос

SELECT * FROM `datafeeds` 
WHERE `device_id` = 1 
GROUP BY `description 
ORDER BY `score` 
LIMIT 10'; 
+0

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

+0

Этот запрос также дает вам тот же результат, что и запрос, который указан вами. – Assen

+0

Это дает неопределенные результаты для неагрегированных столбцов – Strawberry

0

Добавьте первичный ключ и заказывайте это. Это действительно помогает.

+0

В MySQL нет такой вещи. Вы не можете установить порядок PK (вы можете в запросе, но он не реализован -> не влияет). – Pred

0

Позволяет делать это шаг за шагом:

Сначала получите список описаний интересующих вас с идентификатором из вашей таблицы:

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 в качестве первого столбца в индексе. Это зависит от данных, которых мы не знаем.

Пожалуйста, обратите внимание, что

  1. группировки на text колонке медленно и будет медленным, даже с индексами
  2. индекс на text колонке будет почти в два раза требования к хранению таблицы
Смежные вопросы