2016-05-19 9 views
2

Мы пытаемся выбрать из нескольких таблиц в базе данных MySQL.Также включая NULL строки в MySQL SELECT Query

Наш запрос:

SELECT r.reviews_id, 
     r.customers_name, 
     r.date_added, 
     rd.reviews_text, 
     r.reviews_rating, 
     c.customers_email_address 
FROM reviews r, reviews_description rd, customers c 
WHERE r.customers_id = c.customers_id 
    AND r.reviews_id = rd.reviews_id 
    AND r.products_id = '74' 
    AND r.approved='1' 
ORDER BY LENGTH(rd.reviews_text) DESC 

Однако таблица reviews также имеет NULL записи на поле customers_id

Команда WHERE r.customers_id = c.customers_id ограничивает его только полями, которые имеют customers_id

I было интересно, как мы можем также выбрать поля NULL?

Мы опробовали WHERE (r.customers_id = c.customers_id) OR (r.customers_id IS NULL) - но это не сработает.

Благодарим за помощь.

+0

или условие должно быть, как это (r.customers_id = с .customers_id ИЛИ r.customers_id IS NULL) – JYoThI

ответ

2

Не используйте старый неявный синтаксис соединения. Используйте явное присоединяется - в этом случае left join

select r.reviews_id, r.customers_name, r.date_added, rd.reviews_text, r.reviews_rating, 
     c.customers_email_address 
FROM reviews r 
INNER JOIN reviews_description rd ON r.reviews_id = rd.reviews_id 
LEFT JOIN customers c ON r.customers_id = c.customers_id 
WHERE r.products_id = '74' 
AND r.approved='1' 
ORDER BY LENGTH(rd.reviews_text) DESC 
+0

Большое спасибо - это отлично поработало. –

+0

Однако запрос кажется немного медленным. Есть ли способ оптимизировать это? Спасибо за вашу помощь. –

+0

Да, читайте об индексах. Но поскольку вы используете функцию в 'order by', запрос может быть улучшен только в условиях фильтра в предложении' where'. –

-2

Это должно быть так:

WHERE (r.customers_id = c.customers_id = 0 OR r.customers_id IS NULL) 

Вместо этого:

WHERE (r.customers_id = c.customers_id) OR (r.customers_id IS NULL)