Mysql join разных таблиц в зависимости от значения поля в case

ShaDeRzz

Гуру форума
Регистрация
16 Окт 2007
Сообщения
177
Реакции
66
Приветствую.
Не могу разобраться с составлением запроса, в котором необходимо присоединять к выборке ту или иную таблицу 'b' в зависимости от значения поля в таблице 'a'.

Пробую конструкцию такого вида:
Код:
SELECT a.id, a.from_type, a.from_id, a.to_type, a.to_id, a.mail_subject, a.mail_text, b.name as from_name,
    CASE a.from_type
        WHEN 'f' THEN
        b.firm_logo FROM clients_message a LEFT JOIN companies b ON b.id = a.from_id
        ELSE
        b.avatar FROM clients_message a LEFT JOIN clients b ON b.id = a.from_id
    END AS from_img
WHERE a.from_id = 23 OR a.to_id = 23

Получаю ошибку:
Код:
ERROR:  syntax error at or near "FROM"
LINE 1: ...e as from_name, CASE a.from_type WHEN 'f' THEN b.firm_logo FROM clien...
(курсор с пометкой ошибки на слове FROM)
 
Так не получится...
Зато можно так:
Код:
select  a.*, 
         case a.from_type
              when 'f' THEN (select b.firm_logo from companies b where b.id = a.from_id) 
               else  (select b.avatar from clients b where b.id = a.from_id) 
          end as  from_name
from clients_message a
WHERE a.from_id = 23 OR a.to_id = 23
 
Зато можно так:
Спасибо, но в том-то и дело, что из второй таблицы нужно вытянуть не одно поле, а несколько.


Пока решил задачу таким образом:


Код:
$sql = 'SELECT  a.id, a.from_type, a.from_id, a.to_type, a.to_id, a.mail_subject, a.mail_text,
    COALESCE(b.name, c.name) as from_name, c.avatar as from_avatar
    FROM    clients_message a
            LEFT OUTER JOIN companies b ON b.id = a.from_id AND a.from_type = \'f\'
            LEFT OUTER JOIN clients c ON c.id = a.from_id AND a.from_type = \'p\'
    WHERE a.from_id = '.$this->id.' OR a.to_id = '.$this->id
;

Но не уверен в оптимальности решения. Поэтому буду рад, если предложите другие, более правильные варианты.

Уточню цель:
Есть 3 таблицы: сообщения, пользователи и компании.
В таблице сообщений хранится заголовок и текст сообщения, отправитель, получатель, идентификаторы, характеризующие отношение отправителя и получателя к группе "пользователи" или к группе "компании". В зависимости от этого отношения, при выборке сообщений из базы необходимо делать JOIN соответствующей таблицы "пользователи" или "компании", с целью вытянуть от туда дополнительную информацию об отправителе (и о получателе тоже, но в данном примере я это осознанно убрал, дабы не нагромождать задачу).
 
Назад
Сверху