|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Сразу на примере, чтобы было проще. Пусть есть две таблицы: U - пользователи форума (id, name) P - посты на форуме (id, txt, u_id --> U.id) Требуется: вывести список текстов из постов таблицы P и соответствующие им ники пользователей U.name. В нормальном простейшем случае имеем: Код: sql 1. 2. 3.
Но для некоторых постов (записей P ) отсутствуют соответствующие им записи пользователей таблицы U (да, мы про реальную жизнь). При этом в таблице U точно есть отдельная запись с U.id = -1 "Anonymous" (default-пользователь) Задача : Вывести U.name, P.txt так, чтобы - если соответствие есть - выводилось реальное имя пользователя - если соответствующего пользователя (записи в U) нет - выводилось U.name из строки с U.id = -1 Понятно, что решить можно на разных уровнях, и в прикладном коде можно. Но было бы интересно обсудить варианты решения в SQL. Поделитесь хорошими идеями, плиз! в синтаксисе пригодном для MySQL ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 09:09 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Я придумал только такой вариант: Код: sql 1. 2. 3. 4.
Не проверял, но на вид должно работать. Есть ли способы производительнее? Быть может с переменными как-то? с предварительным получением записи -1 в переменные и потом подстановка из них при надобности? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 09:10 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Sergey Kasatkin, условие в соединении таблиц не сработает это условие сработает в выводе Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 10:44 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
авторНе проверял, но на вид должно работать.сейчас есть отличные онлайн ресурсы, проверяй не хочу https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=45b427b6281aae7ee4c4ed35a3acf4c7 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 11:21 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Alex_Ustinov , За ссылку с подготовленным кейсом - большое спасибо! Кстати, там же проверил - мой вариант тоже работает корректно. Причем формально мой вариант "правильнее" вот для какого случая: если нужная нам запись в U есть, но name в ней почему-то NULL (в жизни, понятно, выбираются какие-то еще поля), то, согласно постановке, будет некорректно взять значение для name из записи с U.id = -1 Это если придираться. Однако меня, скорее, волнует вопрос производительности. Хочется найти максимально быстрый вариант SQL для указанной задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 11:34 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Sergey Kasatkin, а чего не просто Код: sql 1. 2. 3.
Полагаю, это и будет максимально быстро ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 12:31 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Чё так сложно-то? две копии таблицы, фэйк-запись... понакрутили... Код: sql 1. 2. 3. 4.
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=a488517f51ed0cbe7fea028b0108aff3 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 12:35 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
читаем тз - вывести вместо NULL Name c id=-1 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 14:05 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Alex_Ustinov читаем тз - вывести вместо NULL Name c id=-1 С учётом того, что Sergey Kasatkin в таблице U точно есть отдельная запись с U.id = -1 "Anonymous" (default-пользователь) это означает - вывести литерал 'Anonymous' . ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 14:15 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Akina, вывести с id=-1 "Литерал" для БД - сегодня Анонимус, завтра Шрайбикус Sergey KasatkinКстати, там же проверил - мой вариант тоже работает корректно. да, так точно ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 14:17 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Sergey Kasatkin, В поле P.u_id могут быть NULL-ы (не из-за джойна, а в таблице) ? И как их нужно обрабатывать? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 14:20 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Alex_Ustinov "Литерал" для БД - сегодня Анонимус, завтра Шрайбикус Можно полюбопытствовать, почему во фразе Sergey Kasatkin При этом в таблице U точно есть отдельная запись с U.id = -1 "Anonymous" (default-пользователь) Вы информацию о гарантированном существовании записи ("точно есть отдельная запись") связываете с id , но отказываете в точно такой же связи с name ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 14:33 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Akina, вы это "теплое с мягким не путайте" ... к чему так много умных слов. я четко описал почему. Если потребуется вывести "Пупкин" - полезем переделывать запрос? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 14:41 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Не я кивал на ТЗ. Уж если апеллировать к нему, то ко всему сразу, а не только к той части, которая понравилась. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 14:47 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Akina Не я кивал на ТЗ. Уж если апеллировать к нему, то ко всему сразу, а не только к той части, которая понравилась. читаем тз авторЗадача: Вывести U.name , P.txt так, чтобы - если соответствие есть - выводилось реальное имя пользователя - если соответствующего пользователя (записи в U) нет - выводилось U.name из строки с U.id = -1 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 15:43 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
И опять - одну часть ТЗ, удобную, гордо цитируем. А другую часть: Sergey Kasatkin При этом в таблице U точно есть отдельная запись с U.id = -1 "Anonymous" (default-пользователь) стыдливо так не замечаем? потому как она чётко определяет то самое значение "U.name из строки с U.id = -1"... а это неудобно. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 18:06 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Akina стыдливо так не замечаем?я ни ОДНОЙ своей ошибки-неточности не стыжусь. Я это это не то что заметил, а 55 раз перечитал. сверху - ПОДВОДКА. ТЗ - подчеркнуто . ПОДЧЕРКНУТО. Почему так зацепило такое элегантное решение у ТС? При использовании табличной подстановки с Id=-1 в 50-ти запросах для изменения "Анонимуса" на "Шрайбикуса" достаточно Апдейта 1-й записи, а не исправления 50-ти запросов. Ваше решение правильно по "подводке", но не по ТЗ. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 19:23 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Alex_Ustinov Почему так зацепило такое элегантное решение у ТС? Использование лишней с точки зрения логики копии таблицы - как минимум. Непрозрачность логики (дай голый текст запроса кому-нить и попроси сказать, что он делает...). Не говорю уж о том, что существование записи с внешним дефолтным значением (не путать с атрибутом DEFAULT) и отрицательным уникальным индексом - далеко за пределами best practice. Ладно. Нафиг. Будем считать что Вы правы. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 20:18 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
я уже допустил, что отчасти вы правы. Хотя "best practice"... а что такое "best practice"? у нас в эту зиму - валенки, хотя юг... а год назад в шортах в декабре в магазин ходил...) ...... 5 минут думал как объяснить... нафиг ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2022, 22:31 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Akina И опять - одну часть ТЗ, удобную, гордо цитируем. А другую часть: Sergey Kasatkin При этом в таблице U точно есть отдельная запись с U.id = -1 "Anonymous" (default-пользователь) стыдливо так не замечаем? потому как она чётко определяет то самое значение "U.name из строки с U.id = -1"... а это неудобно. Если уж строго читать ТЗ и к нему аппелировать, но в приведённой вами цитате никак не сказано, что значение поля U.name точно равно "Anonymous" для записи с U.id = -1. Это вы все же додумываете то, чего нет, согласитесь :) Просто запись с U.id = -1 таблицы U условно назовем "Anonymous". ничего иного в ТЗ не написано ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2022, 09:20 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Sergey Kasatkin Просто запись с U.id = -1 таблицы U условно назовем "Anonymous". Таблица пользователей U хранит экземпляры сущности Пользователь. Однако Anonymous экземпляром этой сущности не является. Ибо не существует однозначно идентифицированного экземпляра объекта, который соответствует этой записи. Данное значение является шаблоном-заполнителем, применяемым в случае невозможности однозначно идентифицировать связанный экземпляр сущности. То есть это шаблон, фактически применяемый при обработке особой ситуации на уровне приложения. Следовательно, он должен идентифицироваться как элемент настройки приложения, экземпляр сущности "Настроечная Переменная". А потому запись с Anonymous не должна присутствовать в таблице пользователей. Это значение может быть опцией настройки, хранимой обычным образом (в том числе и в специальной служебной таблице) либо константой, включаемой в код программы хардкодом. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2022, 13:10 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Akina Данное значение является шаблоном-заполнителем, применяемым в случае невозможности однозначно идентифицировать связанный экземпляр сущности. То есть это шаблон, фактически применяемый при обработке особой ситуации на уровне приложения. Не совсем понятно почему именно "на уровне приложения" на ваш взгляд. Чем код приложения, выполяемыей на SQL-сервере, не годится для реализации данной бизнес-логики? (SQL-запросы - это часть кода приложения, согласитесь.) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 06:46 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Sergey Kasatkin Не совсем понятно почему именно "на уровне приложения" Да потому что Akina Таблица пользователей U хранит экземпляры сущности Пользователь. Однако Anonymous экземпляром этой сущности не является. Он станет таковым, если в таблице постов заменить все неизвестные u_id на -1 (будет означать Неизвестный пользователь) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 10:44 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
paver Sergey Kasatkin Не совсем понятно почему именно "на уровне приложения" Да потому что Akina Таблица пользователей U хранит экземпляры сущности Пользователь. Однако Anonymous экземпляром этой сущности не является. Вопрос мой был "почему на уровне приложения" непременно следует решать этот вопрос, а не на уровне SQL-сервера. Не могу ваше объяснение понять. Вопрос "философский", конечно, и всё же. Есть некая логика алгоритма, которую надо организовать. Почему на языке SQL её, по вашему мнению, реализовать неправильно, а на другом языке - правильно? paver Он станет таковым, если в таблице постов заменить все неизвестные u_id на -1 (будет означать Неизвестный пользователь) А вот это здравая мысль. В самом деле: какой смысл хранить id пользователя, которого по каким-то причинам уже нет? можно и "забыть" его "реальный" id, т.к. никакой ценности он уже не несет, информации о пользователе этом нет. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 11:34 |
|
В Left Join подставлять определённую запись для отсутствующих
|
|||
---|---|---|---|
#18+
Sergey Kasatkin Вопрос мой был "почему на уровне приложения" непременно следует решать этот вопрос, а не на уровне SQL-сервера. Потому что SQL - язык манипулирования реляционными БД. Диалог о суслике модели сущность-связь: - Видишь связь между экземплярами (5, 'Salut', 55) и (-1, 'Anonymous') сущностей Пост и Юзер соответственно? - Нет - А она есть! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2022, 13:29 |
|
|
start [/forum/topic.php?fid=47&gotonew=1&tid=1827784]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
346ms |
get topic data: |
12ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 9ms |
total: | 468ms |
0 / 0 |