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

Тема в разделе "Базы данных", создана пользователем ShaDeRzz, 21 мар 2012.

Модераторы: latteo
  1. ShaDeRzz

    ShaDeRzz

    Регистр.:
    16 окт 2007
    Сообщения:
    176
    Симпатии:
    65
    Приветствую.
    Не могу разобраться с составлением запроса, в котором необходимо присоединять к выборке ту или иную таблицу '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)
     
  2. baddavil

    baddavil Создатель

    Регистр.:
    14 мар 2012
    Сообщения:
    25
    Симпатии:
    1
    Так не получится...
    Зато можно так:
    Код:
    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
    
     
    ShaDeRzz нравится это.
  3. ShaDeRzz

    ShaDeRzz

    Регистр.:
    16 окт 2007
    Сообщения:
    176
    Симпатии:
    65
    Спасибо, но в том-то и дело, что из второй таблицы нужно вытянуть не одно поле, а несколько.


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


    Код:
    $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 соответствующей таблицы "пользователи" или "компании", с целью вытянуть от туда дополнительную информацию об отправителе (и о получателе тоже, но в данном примере я это осознанно убрал, дабы не нагромождать задачу).
     
  4. baddavil

    baddavil Создатель

    Регистр.:
    14 мар 2012
    Сообщения:
    25
    Симпатии:
    1
    А зря! Индексы companies и clients по id есть? Тогда оптимальнее - некуда!