Почему этот SQL-запрос не упорядочивается по моему псевдониму?

#mysql #sql

#mysql #sql

Вопрос:

Этот SQL-запрос SELECT выдает мне все нужные строки, но предложение ORDER BY, похоже, не соответствует определяемому мной псевдониму.

 SELECT
    IFNULL(AVG(ratings.rating), 0) AS avgrating,
    users.username,
    content.*
FROM content
LEFT JOIN ratings
    ON ratings.contentid = content.id
LEFT JOIN users
    ON users.id = content.userid
GROUP BY id
ORDER BY
    avgrating DESC,
    id DESC;
  

Вместо упорядочивания по avgrating первому и id второму, он упорядочивает только по id . Я просмотрел ответы на похожие вопросы, но мне ничего не показалось полезным для моего случая. Есть идеи о том, как это решить? Дайте мне знать, если я должен предоставить дополнительную информацию.

Спасибо!

РЕДАКТИРОВАТЬ: вот данные результата. Простите за бессмысленный текст-заполнитель.

 avgrating   username    id  title       content category    userid
3.0000      jijoij      11  nuunun      "foo"   0           2
0.0000      jijoij      10  regreg      "foo"   3           2
0.0000      jijoij      9   fefefe      "foo"   3           2
0.0000      testkonto   8   i34jt4jt    "foo"   3           4
0.0000      testkonto   7   oouo        "foo"   3           4
0.0000      testkonto   6   oyouuoouo   "foo"   3           4
5.0000      testkonto   5   oyouuouo    "foo"   3           4
1.0000      testkonto   4   jijijijiji  "foo"   3           4
0.0000      testkonto   3   fgreg       "foo"   3           4
0.0000      testkonto   2   tbtrb       "foo"   3           4
3.6667      jijoij      1   gergj       "foo"   1           2
  

РЕДАКТИРОВАТЬ 2: я попытался указать content.id в ORDER BY предложении, так как это то, что я хотел. Ничего не изменилось.

Комментарии:

1. работает ли это, когда вы order by указываете само выражение вместо псевдонима? например order by IFNULL(AVG(ratings.rating), 0) desc, id desc

2. В таком случае, можете ли вы опубликовать результаты, которые у вас есть в данный момент, с указанием «неправильной» сортировки?

3. Вы хотите, чтобы он был сгруппирован content.id и упорядочен по content.id ? Потому что я считаю, что это то, что происходит. Неоднозначное id относится к from таблице.

4. @Schwern Это content.id то, что я хочу ORDER BY . Изменение его на это, похоже, ничего не дает.

5. @Schwern Я использую MySQL Community Server 5.7.11.

Ответ №1:

Я собрал это вместе в SQLFiddle, и это выявило проблему.

 avgrating   username    id  userid
5           joe         1   1
4           joe         2   1
3           joe         3   1
2           jill        5   4
2           jill        6   4
1           bob         4   3
  

Это группировка и упорядочение по content.id . Я подозреваю, что ОП хотел users.id . Проблема в этом:

 GROUP BY id
ORDER BY
    avgrating DESC,
    id DESC;
  

id неоднозначно. Все эти таблицы (в любом случае, в моей схеме) имеют id столбец. Я не уверен, существует ли стандартный способ его решения, но MySQL, похоже, выбирает content.id , потому что запрос есть FROM content .

Решение состоит в том, чтобы сделать id столбец однозначным.

 GROUP BY users.id
ORDER BY
    avgrating DESC,
    users.id DESC;
  

Вот результат.

 avgrating   username    id  userid
4           joe         1   1
2           jill        5   4
1           bob         4   3
  

Комментарии:

1. Спасибо, но я действительно content.id хочу УПОРЯДОЧИТЬ. Я только что попытался указать его в предложении ORDER BY, и это ничего не изменило.

2. @AgBengip Черт возьми, теперь я не могу заставить SQLFiddle перезагрузить мою схему. :-/

3. @AgBengip Вы пробовали просто ORDER BY avgrating DESC без вторичного, чтобы посмотреть, будет ли он хотя бы отсортирован по среднему значению?

4. Да, он вообще не сортируется, когда я это делаю.