2015-02-04 3 views
0

У меня есть две таблицы: деятельность и activity_images и ключевое ограничение иностранного является:Mysql - левый присоединиться вопросы, где положение

activities.id = activitiy_images.activity_id 

Теперь некоторые действия имеют изображения, а некоторые нет, что означает для конкретной деятельности .id, может не быть записи в actions_images.

Я хочу получить все данные по умолчанию, независимо от данных, имеющихся в Activity_images.

Ниже мой запрос:

select a.*,a.id as 'activity_id',b.* 
    from activities a 
    left join activity_images b on a.id = b.activity_id 
    where b.image_type='main' LIMIT 0, 9 

Этот вопрос с выходом. В приведенном выше запросе даются только данные для совпадающих строк и где b.image_type = 'main'. Он не выводит строки, для которых нет записи в actions_images.

Я хочу все строки, но в то же время я хочу убедиться, что b.image_type = 'main', потому что есть другие значения для image_type, и я просто хочу захватить значения для image_type = 'main' (If у всех есть матч).

Прошу совета. Заранее спасибо.

+0

Если нет соответствующей строки в activity_images тогда как может image_type = главное? Подумайте об этом логически. – Devon

+0

Если (неформально), вы хотите, чтобы все строки без объектов activity_images и строк с активными_имяями, тип которых является основным, вы должны изменить предложение where на 'where coalesce (b.image_type, 'main') = 'main''. Если это не ваше намерение, ср. Комментарий Девон. – collapsar

+0

thats весь пункт .... я имею в виду..если во всех совпадениях строк они должны совпадать для image_type = 'main', если они не возвращают их как null.Isnt, что возможность? – user1411837

ответ

0

Когда критерии в пункте WHERE относится к присоединяемой таблице, это в основном обрабатывается как INNER JOIN.

Правильный способ справиться с этим состоит в перемещении критериев в ON пункте:

SELECT a.*, a.id as 'activity_id', b.* 
    FROM activities a 
    LEFT JOIN activity_images b 
    ON b.activity_id = a.id 
    AND b.image_type = 'main' 
+0

Большое спасибо ... этот фактически помог во многом больше, чем принятый ранее ответ. – user1411837

1
select a.*,a.id as 'activity_id',b.* 
    from activities a 
    left join activity_images b on a.id = b.activity_id 
    where b.image_type='main' OR b.image_type IS NULL 
LIMIT 0, 9 

Будет ли это делать то, что вы хотите?

Я бы порекомендовал image_type быть столбцом не null в этом случае, иначе вы могли бы получить данные со соответствующей строкой, но на самом деле образ_имени установлен на null.

+0

Ох ... я сейчас чувствую себя глупо. Да, это то, чего я хотел. Большое спасибо Девон. – user1411837

+0

Добро пожаловать. – Devon

0

Попробуйте подзапрос. Это будет предварительно выбрать только строки в таблице изображений деятельности с преимущественным вашим типом изображения, и по-прежнему будет выбрать все, от вашей деятельности в таблице:

SELECT a.*,b* 
FROM activities a 
    LEFT JOIN (
     SELECT * FROM activity_images WHERE image_type = 'main' 
    ) b ON a.id = b.activity_id; 
SELECT * FROM activity_images WHERE image_type = 'main' a; 
+0

Попробуйте форматировать текст запроса, чтобы его было легче читать. – DanM7

+0

Спасибо @DanM - мой первый пост кода здесь, и форматирование определенно не выполнялось. – Songsparrow

Смежные вопросы