2016-01-24 2 views
1

Я запрос, как это:использования присоединиться, если есть запись

select tractions.id,tractions.expired,tractions.succ,tractions.cradit_end_date, 
         tractions.user_id,users.family,tractions.coupon_code,users.username,traction_details.title, 
       traction_details_sub.title as sub_title,tractions.coupon_parent,tractions.coupon_id,tractions.coupon_property_id 
       from tractions,traction_details,traction_details_sub,users 
        WHERE 
        tractions.app='mobile' 
        AND tractions.succ = 1 
        AND tractions.user_id=$user_id 
        AND tractions.id = traction_details.tr_id 
        AND tractions.id = traction_details_sub.tr_id 
        AND tractions.user_id = users.id 

сейчас, некоторые записи в tractions не любой tr_id в traction_details_sub таблицы.

как проверить, есть ли traction_details_sub стол tr_id, затем присоединиться к этим таблицам?

+0

Возможный дубликат http://stackoverflow.com/questions/38549/difference-between-inner-and-outer-joins?rq=1 – Maritim

ответ

1

Переключить на ANSI объединения (они были почти повсеместно доступны в течение длительного времени) и использовать внешнее соединение таблиц, которые могут не иметь записей:

SELECT 
    t.id 
, t.expired 
, t.succ 
, t.cradit_end_date 
, t.user_id 
, u.family 
, t.coupon_code 
, u.username 
, d.title 
, s.title as sub_title 
, t.coupon_parent 
, t.coupon_id 
, t.coupon_property_id 
FROM tractions t 
LEFT OUTER JOIN traction_details d ON t.id = d.tr_id 
LEFT OUTER JOIN traction_details_sub s ON t.id = s.tr_id 
JOIN users u ON t.user_id = u.id 
WHERE t.app='mobile' AND t.succ = 1 AND t.user_id=$user_id 

Обратите внимание, как этот синтаксис перемещает таблицы от FROM в отдельные соединения, с LEFT OUTER JOIN, обозначающими таблицы с необязательными строками. Также обратите внимание, как последние три условия вашего предложения WHERE стали ON условиями соответствующих объединений. Наконец, обратите внимание на использование таблицы псевдонимов (т.е. t для tractions, d для traction_details, s для traction_details_sub и u для users), чтобы сократить запрос.

0

Сначала выберите все tr_id из traction_details и после того, как вы повторить SQL-запрос добавить условие в tractions.id (все идентификатор доступного)

0

Используйте левую присоединиться к traction_details_sub таблице. Если нет соответствующей записи, вы получите tds.title как null.

select t.id,t.expired,t.succ,t.cradit_end_date, 
t.user_id,u.family,t.coupon_code,u.username,td.title, 
tds.title as sub_title,t.coupon_parent,t.coupon_id,t.coupon_property_id 
from 
tractions t 
    inner join 
traction_details td 
    on t.id = td.tr_id 

    left join 
traction_details_sub 
    on t.id = tds.tr_id 

    inner join 
users u 
    on t.user_id = u.id 
WHERE 
    t.app='mobile' 
    AND t.succ = 1 
    AND t.user_id=$user_id 
Смежные вопросы