Группа MySQL по выбранной строке

У меня есть следующая таблица:

+------+---------+--------+
| lang | title   | url    |
+------+---------+--------+
| pt   | Livro 1 | o294jl |
| en   | Book 1  | o294jl |
| en   | Book 2  | 7s621f |
+------+---------+--------+

Мне нужно отдавать приоритет lang, когда системным языком является определенный язык. Например, предположим, что я работаю с языком pt, мне нужен запрос, который возвращает следующее:

+------+---------+--------+
| lang | title   | url    |
+------+---------+--------+
| pt   | Livro 1 | o294jl |
| en   | Book 2  | 7s621f |
+------+---------+--------+

Обычно мне нужно установить детерминированное значение для title, lang и т.д., когда используется GROUP BY url. В настоящее время он в основном получает наименьшее значение id:

SELECT lang, title, url
FROM book
GROUP BY book.url

Я пробовал использовать ORDER BY с предложениями CASE, но поскольку он запускается после операции GROUP BY, он не работает. Я мог бы использовать GROUP_CONCAT с IF для выбора правильного значения, но поскольку моя настоящая таблица имеет несколько столбцов, это выглядело бы неправильно.

Спасибо.

Попробуйте order by field()

Madhur Bhaiya 10.10.2018 08:38

@MadhurBhaiya он уже пробовал это, сказано в описании, а также порядок в каком поле? если вы попытаетесь упорядочить его по полю lang, en также появится первым, если вы не отсортируете его как DESC.

Alexis Villar 10.10.2018 08:44

Все ли языковые коды будут иметь приоритетный порядок? или вы просто хотите, чтобы pt имел первый приоритет; остальные равны и может прийти самый низкий идентификатор строки?

Madhur Bhaiya 10.10.2018 09:18

@AlexisVillar прочитайте о функции field()

Madhur Bhaiya 10.10.2018 16:29
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
41
1

Ответы 1

В вашем случае, скажем, если вы знаете, что в вашем приложении есть только два типа языков: «pt» и «en». вы можете просто расширить свой запрос с помощью order by lang desc.

Вот образец

SELECT b.lang, b.title, b.url
FROM book b
GROUP BY b.lang,b.title,b.url
ORDER BY b.lang DESC

Но в случае, если в будущем у вас может быть больше типов языков, и вам может потребоваться упорядочить их по определенному языку. Я бы посоветовал вам добавить еще одну таблицу для хранения значения приоритета lang. Итак, вы можете просто упорядочить по приоритету, чтобы получить тот язык, который должен быть первым.

Вот образец

SELECT b.lang, b.title, b.url
FROM book b 
INNER JOIN priority p ON p.lang = b.lang
ORDER BY p.order

Второе решение кажется работоспособным. Я бы убрал первое решение.

Strawberry 10.10.2018 09:40

Другие вопросы по теме