#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. Да, он вообще не сортируется, когда я это делаю.