Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Связь с несуществующей записью при выборке
 
 автор: TetRiska   (06.04.2011 в 10:50)   письмо автору
 
 

Всем привет. Не хочется плодить кучу запросов, вот и пытаюсь постичь идеального решения в выборках из многих таблиц в одном запросе. Сперва я делаю 1 запрос к одной таблице после чего делаю объединения с другими таблицами. Но тут подводный камень, т. к. при объединение с другими таблицами в них может не быть той записи с ИД которой мы связываем.
Если писать так:
SELECT `em_business_group_simage`,
               a.`em_business_group_name`,
               a.`em_business_group_data`,
               a.`em_business_group_desc`,
               a.`em_business_group_id`,
               a.`em_business_group_direct`,
               a.`em_business_group_category`,
               b.`em_business_group_stat_overal`
        FROM `em_business_group` a
        JOIN `em_business_group_stat` b ON (a.`em_business_group_id` = b.`em_business_group_id`)
        WHERE `em_company_id` = 2137
        AND a.`em_business_group_module` = 'produce'
        AND a.`em_business_group_access` = 'y'
        AND a.`em_business_group_deleted` = 'n'

Мне выдаст 1 запись, их всего 3, у каждой из которых есть связь с другой таблицей, но только у одной есть запись в связываемой таблице. Этот вариант не подошел т. к. заставляет делать запрос без объединения и потом писать еще один. Я всего лишь дописал LEFT и тогда выбрало все, мне так и надо.
SELECT `em_business_group_simage`,
               a.`em_business_group_name`,
               a.`em_business_group_data`,
               a.`em_business_group_desc`,
               a.`em_business_group_id`,
               a.`em_business_group_direct`,
               a.`em_business_group_category`,
               b.`em_business_group_stat_overal`
        FROM `em_business_group` a
        LEFT JOIN `em_business_group_stat` b ON (a.`em_business_group_id` = b.`em_business_group_id`)
        WHERE `em_company_id` = 2137
        AND a.`em_business_group_module` = 'produce'
        AND a.`em_business_group_access` = 'y'
        AND a.`em_business_group_deleted` = 'n'

Мучает только одно, хуже таким объединением я не сделаю, если связываю с таблицей записи в которой может еще не существовать до выборки?

  Ответить  
 
 автор: cheops   (06.04.2011 в 11:32)   письмо автору
 
   для: TetRiska   (06.04.2011 в 10:50)
 

Это нормальная практика, с LEFT JOIN вы держите руку на пульсе и всегда знаете, что из левой таблицы вы получите гарантировано все записи по условию. Отсутствие соответствия в правой таблице всегда можно проконтролировать по NULL в прикладном коде. Собственно, LEFT JOIN используется раз в пять чаще, чем JOIN.

  Ответить  
 
 автор: TetRiska   (06.04.2011 в 11:41)   письмо автору
 
   для: cheops   (06.04.2011 в 11:32)
 

спасибо

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования