group by вместе с order by

278
24 января 2018, 13:14

Делается мультиязычность сайта путем вывода более популярных, собравших большее кол-во голосов, значений из mysql базы данных.

Таблица состоит:

|id|text_id|module|lang| text |voices|uid|
------------------------------------------
|1 |   1   |anketa| ru |Ашибка|   1  | 1 |
------------------------------------------
|2 |   1   |anketa| ru |Ошибка|   2  | 2 |

У меня получился запрос:

SELECT *
FROM `langs` 
WHERE `module`='anketa' 
  AND `lang`='ru' 
GROUP BY `text_id` 
ORDER BY `voices` DESC

Но он выводит значение первое которое по списку с минимальным количеством voices, а должно выводить только с наибольшим количеством voices.

Помогите составить правильный запрос.

Answer 1

Решение вопроса:

SELECT
    `l`.`text_id`, `l`.`text`, `l`.`voices`
FROM `langs` `l`
INNER JOIN (
    SELECT
        `text_id`, MAX(`voices`) AS `MaxVoice`
    FROM `langs`
    GROUP BY `text_id`
) `lm`
ON `l`.`text_id` = `lm`.`text_id` AND
   `l`.`voices` = `lm`.`MaxVoice` AND
   `l`.`module` = 'anketa' AND
   `l`.`lang` = 'ru'
GROUP BY `l`.`text_id`
ORDER BY `l`.`text_id` ASC
Answer 2

По стандарту SQL в запросе с группировкой в части перечисления полей (то, что идет после SELECT) можно указывать ТОЛЬКО те поля, по которым идет группировка, или которые используются с групповыми функциями (sum, max, group_concat, ...). MySQL допускает выполнение запросов, не удовлетворяющих данному правилу. При этом для полей без групповых функций и не указанных в части GROUP BY выбирается произвольная строка из группы. Примеры см Группировка в MySQL

READ ALSO
Параллельные запросы к MySQL

Параллельные запросы к MySQL

Подскажите решение: Есть 5 mysql серверов Есть программа написана на php В базе данных храниться список товаров, шардированы по коду, бывает такое...

284
(C#) System.Security.Cryptography.CryptographicException: “Плохие данные. ”

(C#) System.Security.Cryptography.CryptographicException: “Плохие данные. ”

ЗдравствуйтеЯ пишу свой TLS сервер, но возникла такая проблема, я пытаюсь расшифровать сообщение Finished (Encrypted Handshake Message) приватным ключём сертификата,...

311
Unity3D: как обратиться к gameobjects, которые содержатся в <List>

Unity3D: как обратиться к gameobjects, которые содержатся в <List>

У меня есть элемент который служит для хранения gameobject'ов , мне нужно обратиться ко всем этим gameobject'ам для дальнейшей работы сразу со всеми...

219
Сравнение пробела типа string

Сравнение пробела типа string

Каким образом в C# можно сравнить символ строки, обращаясь по индексу в цикле с пробелом? Как я понял, обращение по индексу к строке - возвращает...

238