Запрос с условием

Тема в разделе "Базы данных", создана пользователем NoN, 24 апр 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. NoN

    NoN Постоялец

    Регистр.:
    25 ноя 2008
    Сообщения:
    79
    Симпатии:
    33
    Таблицы

    t1
    p_id | p_name
    0 | bla0
    1 | blbbla
    3 | bla1

    t2
    c_id | c_p
    1 | имя 1
    2 | имя 2
    3 | имя 3


    делаю
    select * from t1 join t2 ON (t1.p_id=t2.c_id or t1.p_id=0);

    мне нужно что бы на выдаче было только 1 совпадение, если условие t1.p_id=t2.c_id не срабатывает то должно выполнятся t1.p_id=0

    Как это реализовать?
     
  2. Rheola

    Rheola Создатель

    Регистр.:
    12 фев 2009
    Сообщения:
    19
    Симпатии:
    5
    Вот так попробуй

    select * from t1 join t2 ON t1.p_id=t2.c_id
    union
    select * from t1 join t2 ON t1.p_id=0 where 0 in (select count(t1.p_id) from t1 join t2 ON t1.p_id=t2.c_id) ;
     
  3. AndreyD2

    AndreyD2

    Регистр.:
    21 окт 2008
    Сообщения:
    194
    Симпатии:
    67
    Код:
    select t1.*, IFNULL(t2.c_p,t3.c_p) from t1 
    left join t2 ON t1.p_id=t2.c_id
    left join t3 ON t3.p_id=0 and t2.c_id is null
    
     
    NoN нравится это.
  4. NoN

    NoN Постоялец

    Регистр.:
    25 ноя 2008
    Сообщения:
    79
    Симпатии:
    33
    пишет:
    Table 'test.t3' doesn't exist


    собственно мой запрос...

    Код:
    SELECT *
    FROM firms_comment  AS fcm
    JOIN firms_rating AS fr ON fcm.fc_cat = fr.fr_cat OR fr.fr_cat =0
    JOIN firms_cat AS fc ON fcm.fc_cat = fc.fc_id
    WHERE fcm.fc_office ='$office_id'
     
  5. MadWizard

    MadWizard Постоялец

    Регистр.:
    24 мар 2009
    Сообщения:
    145
    Симпатии:
    20
    Как-то так
    Код:
    SELECT IFNULL(t1.fr_cat,t2.fr_cat)
    FROM firms_comment  AS fcm
    JOIN firms_cat AS fc ON fcm.fc_cat = fc.fc_id
    
    LEFT JOIN firms_rating AS t1 ON fcm.fc_cat = t1.fr_cat 
    LEFT JOIN firms_rating AS t2 ON t1.fr_cat = 0 AND t1.fr_cat IS NULL
    
    WHERE fcm.fc_office ='$office_id'
    
     
    NoN нравится это.
  6. NoN

    NoN Постоялец

    Регистр.:
    25 ноя 2008
    Сообщения:
    79
    Симпатии:
    33
    Спасибо разобрался в итоге получился запрос

    Код:
    SELECT fcm. * , IFNULL( t1.fr_cat, t2.fr_cat ) , IFNULL( t1.fr_rating_1, t2.fr_rating_1 ) , IFNULL( t1.fr_rating_2, t2.fr_rating_2 ) , IFNULL( t1.fr_rating_3, t2.fr_rating_3 ) , IFNULL( t1.fr_rating_4, t2.fr_rating_4 ) 
    FROM ws_firms_comment AS fcm
    JOIN ws_firms_cat AS fc ON fcm.fc_cat = fc.fc_id
    LEFT JOIN ws_firms_rating AS t1 ON fcm.fc_cat = t1.fr_cat
    LEFT JOIN ws_firms_rating AS t2 ON t2.fr_cat =0
    WHERE fcm.fc_office = '23'
    LIMIT 0 , 30
    
    в курсе ктонибудь как можно упростить конструкцию

    Код:
    IFNULL( t1.fr_cat, t2.fr_cat ) , IFNULL( t1.fr_rating_1, t2.fr_rating_1 ) , IFNULL( t1.fr_rating_2, t2.fr_rating_2 ) , IFNULL( t1.fr_rating_3, t2.fr_rating_3 ) , IFNULL( t1.fr_rating_4, t2.fr_rating_4 ) 
    типа как t1.*
     
  7. AndreyD2

    AndreyD2

    Регистр.:
    21 окт 2008
    Сообщения:
    194
    Симпатии:
    67
    Не парься, она выглядит громоздко.
    Но сервер не грузит.
     
  8. MadWizard

    MadWizard Постоялец

    Регистр.:
    24 мар 2009
    Сообщения:
    145
    Симпатии:
    20
    В MSSQL это делает функция COALESCE, в MySQL аналогов вроде бы нет.
     
Статус темы:
Закрыта.