LEFT JOIN Не вытаскивает NULL

12
G
На сайте с 24.10.2009
Offline
51
1156

Добрый день.

В первой таблице хранятся Списки страховых. Во второй расчеты на них для разных клиентов.

Но например во вротой таблице могу присутствовать не все расчеты, если компания в первую таблицу была добавлена после создания списка расчетов.

Я составил такой запрос:


SELECT a.id, a.title, a.contacts, b.group_id, b.clid, b.iid, b.osago, b.kasko, b.notes, b.date_added, b.status FROM bb_p_ins_comp a LEFT JOIN bb_p_ins_price b ON (a.id=b.iid) WHERE b.group_id='".intval($id)."' OR b.group_id IS NULL ORDER BY a.title ASC

Но вытаскивает он мне только те строки, для которых компаний есть расчет во второй таблице. А надо, чтобы и при несуществующем расчете компания вытаскивалась.

Что я сделал неверно?

[umka]
На сайте с 25.05.2008
Offline
456
#1

… ON (a.id=b.iid OR b.iid IS NULL) …

Лог в помощь!
G
На сайте с 24.10.2009
Offline
51
#2
'[umka:
;10808774']… ON (a.id=b.iid OR b.iid IS NULL) …

Нет. Результат тот же. Вытаскивается только с существующими расчетами.

siv1987
На сайте с 02.04.2009
Offline
427
#3

WHERE b.group_id='".intval($id)."' OR b.group_id IS NULL OR b.group_id=0

капайте в эту сторону

G
На сайте с 24.10.2009
Offline
51
#4
siv1987:
WHERE b.group_id='".intval($id)."' OR b.group_id IS NULL OR b.group_id=0

капайте в эту сторону

Я даже покопал. И выдает он NULL для таблиц без соответствий. Но это по какой-то причине не вытаскивает.

Могу прислать структуры таблиц с содержимым, если необходимо.

---------- Добавлено 03.09.2012 в 21:18 ----------

DROP TABLE IF EXISTS `bb_p_ins_comp`;
CREATE TABLE `bb_p_ins_comp` (
`id` int(50) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`contacts` text NOT NULL,
`status` enum('1','0') NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;

INSERT INTO `bb_p_ins_comp` (`id`, `title`, `contacts`, `status`) VALUES
(1, 'Росгосстрах', '8(800)2000-900', '1'),
(2, 'РЕСО-Гарантия', '8(800)100-63-65', '1'),
(6, 'Талисман', '(843) 264-57-80\r\n(843) 221-14-21', '1'),
(4, 'Цюрих Ритейл', '8(800)700-77-07', '1'),
(7, 'Агропром', 'Контакты', '1');

DROP TABLE IF EXISTS `bb_p_ins_price`;
CREATE TABLE `bb_p_ins_price` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`group_id` int(100) NOT NULL,
`clid` int(255) NOT NULL,
`iid` int(255) NOT NULL,
`osago` float NOT NULL DEFAULT '0',
`kasko` float NOT NULL DEFAULT '0',
`notes` text NOT NULL,
`date_added` int(255) NOT NULL DEFAULT '0',
`status` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=52 ;

INSERT INTO `bb_p_ins_price` (`id`, `group_id`, `clid`, `iid`, `osago`, `kasko`, `notes`, `date_added`, `status`) VALUES
(1, 1, 4, 1, 2350.5, 21880.4, 'При условии оплаты за 3 года', 132465498, '0'),
(2, 1, 4, 2, 2867.25, 18952.1, 'Только на авто в кредит', 43532112, '1'),
(3, 1, 4, 4, 3300, 31320.6, 'Стаж вождения больше 5 лет.\r\nТолько в кредит', 36786355, '0'),
(49, 2, 4, 4, 5680, 34890.5, 'Примечания\r\nРазные факты и все такое', 1346673678, '0'),
(50, 2, 4, 6, 12, 50, '', 1346673678, '0'),
(51, 2, 4, 7, 10, 45, '', 1346673678, '0'),
(47, 2, 4, 1, 3200, 16215, '', 1346673678, '0'),
(48, 2, 4, 2, 4500.5, 35860.3, 'Только на новые автомобили.\r\nСтаж вождения больше 5 лет.', 1346673678, '0');

Вот структура и тестовое содержимое таблиц.

siv1987
На сайте с 02.04.2009
Offline
427
#5
`group_id` int(100) NOT NULL,

Вы какой group_id сравниваете? И вообще покажите мне хоть одно поле с не NOT NULL значением?

G
На сайте с 24.10.2009
Offline
51
#6

Эти асчеты объединены по группам. Вот например надо вытащить расчеты у которых группа равна 1. Но даже если для какой-то компании расчетов не существует, то строки быть должны.

Сравниваю я group_id из второй таблицы.

siv1987
На сайте с 02.04.2009
Offline
427
#7
Gaaarfild:
Сравниваю я group_id из второй таблицы.

Точно? А ничего в нем не смущает? NOT NULL например?

`group_id` int(100) NOT NULL DEFAULT '0',

SELECT c.*, p.* FROM bb_p_ins_comp c LEFT JOIN bb_p_ins_price p ON (c.id=p.iid) WHERE p.group_id IN ({$id},0)

G
На сайте с 24.10.2009
Offline
51
#8
siv1987:
Точно? А ничего в нем не смущает?

`group_id` int(100) NOT NULL DEFAULT '0',

WHERE group_id={$id} OR grup_id=0

Так по сути он NOT NULL если его не заполнили.

А еслион вытаскивается по LEFT JOIN, то его результат разве не NULL? Это не запись из таблицы. Это результат склейки же.

siv1987
На сайте с 02.04.2009
Offline
427
#9
Gaaarfild:
Так по сути он NOT NULL если его не заполнили.
А еслион вытаскивается по LEFT JOIN, то его результат разве не NULL? Это не запись из таблицы. Это результат склейки же.

Вы не правильно понимаете, вы должны сравнивать не результат JOIN'a а значение поле. http://ru.wikipedia.org/wiki/Join_(SQL)#LEFT_OUTER_JOIN

G
На сайте с 24.10.2009
Offline
51
#10
siv1987:
Вы не правильно понимаете, вы должны сравнивать не результат JOIN'a а значение поле. http://ru.wikipedia.org/wiki/Join_(SQL)#LEFT_OUTER_JOIN

Да это все равно ничего не меняет. Даже если я пишу

ON (a.id=b.iid) WHERE b.group_id='".intval($id)."' OR b.group_id=0

Все равно не вытаскиваются.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий