Я интересно, если есть способ, чтобы принести name
информации user_id
, sender_user_id
и recipient_user_id
из схемы в this fiddle.избежать многократных внутренних соединений, чтобы добавить новый столбец (информация) из тех же таблиц
Единственный способ, которым я могу думать сейчас, чтобы сделать это вложенное внутреннее соединение, которое я чувствую, как неэффективно:
SELECT e.id
,msg_owner
,msg_owner_name
,sender_user_id
,sender_name
,recipient_user_id
,f.NAME AS recipient_name
,msg_body
,created_at
FROM (
SELECT c.id
,msg_owner
,msg_owner_name
,sender_user_id
,d.NAME AS sender_name
,recipient_user_id
,msg_body
,created_at
FROM (
SELECT a.id
,user_id AS msg_owner
,NAME AS msg_owner_name
,sender_user_id
,recipient_user_id
,msg_body
,created_at
FROM messages AS a
INNER JOIN users AS b ON a.user_id = b.id
) AS c
INNER JOIN users AS d ON c.sender_user_id = d.id
) AS e
INNER JOIN users AS f ON e.recipient_user_id = f.id
Есть ли (более эффективный) способ привлечь name
значений для каждого из вышеупомянутые три столбца? Спасибо за ваши ответы/предложения!
В ваших многочисленных внутренних соединениях нет ничего плохого. Это совершенно нормально и правильно. Единственное изменение, которое я сделал бы, это то, что вам не нужны три вложенных выбора. 'SELECT a.id, b.id, c.id FROM INNER JOIN b ON aa = bx INNER JOIN c ON ab = cy' отлично работает ... – MatBailie
Можете ли вы опубликовать таблицу того, что вы хотите, чтобы результат выглядел , учитывая таблицы ввода образцов? Поскольку у вас нет вложенных агрегированных групп, все это в основном может быть сделано без каких-либо вложенных SELECT, используя объединения на одном уровне. –
@MatBailie Спасибо за предложение! – user1330974