требуется выбрать все данные из таблицы, в независимости от того, есть ли в связываемой таблице id или нет. IS NULL не срабатывает.

2 views
Skip to first unread message

Dmitry Polushkin

unread,
Oct 17, 2007, 11:30:31 AM10/17/07
to ua_mysql
Краткое описание проблемы:

Есть таблица doors_lift_heights из которой мне бы хотелось выбрать все
данные, в независимости от того, есть ли в таблице doors_lifts2sizes
записи по lift_id = ? или нет (? - placeholder). Указание lift_id -
очень важно. lift_id IS NULL не срабатывает - скорее всего потому что
если в таблице которая связывается через LEFT JOIN данных после связки
= COUNT() = 0, то колонки вообще никак не определяются.


В общем если коротко, требуется выбрать все данные из таблицы
doors_lift_heights внезависимости от того, есть ли в doors_lifts2sizes
что-нибудь по lift_id или нет.

Есть запрос:

SELECT doors_lift_heights.*,
GROUP_CONCAT(lift_width_id ORDER BY lift_width_to ASC) AS widths
FROM doors_lift_heights
LEFT JOIN doors_lifts2sizes USING(lift_height_id)
LEFT JOIN doors_lift_widths USING(lift_width_id)
WHERE (lift_id = ? OR lift_id IS NULL)
GROUP BY lift_height_id
ORDER BY lift_height_to ASC

И есть таблицы:

doors_lifts2sizes CREATE TABLE `doors_lifts2sizes` (
`lift_id` int(11) NOT NULL,
`lift_width_id` int(11) NOT NULL,
`lift_height_id` int(11) NOT NULL,
KEY `lift_id` (`lift_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

doors_lift_heights CREATE TABLE `doors_lift_heights` (
`lift_height_id` int(11) NOT NULL auto_increment,
`lift_height_from` int(11) NOT NULL,
`lift_height_to` int(11) NOT NULL,
PRIMARY KEY (`lift_height_id`),
KEY `lift_height_from` (`lift_height_from`),
KEY `lift_height_to` (`lift_height_to`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8

doors_lift_widths CREATE TABLE `doors_lift_widths` (
`lift_width_id` int(11) NOT NULL auto_increment,
`lift_width_to` int(11) NOT NULL,
PRIMARY KEY (`lift_width_id`),
KEY `lift_width_to` (`lift_width_to`)
) ENGINE=MyISAM AUTO_INCREMENT=19 DEFAULT CHARSET=utf8

doors_lifts CREATE TABLE `doors_lifts` (
`lift_id` int(11) NOT NULL auto_increment
PRIMARY KEY (`lift_id`)
) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=utf8

Заранее благодарен!

A4

unread,
Oct 17, 2007, 11:40:40 AM10/17/07
to ua_mysql
Не очень понятна проблема.

Вопрос: требуется выбрать все данные из таблицы doors_lift_heights


внезависимости от того, есть ли в doors_lifts2sizes что-нибудь по
lift_id или нет

Ответ: SELECT * FROM doors_lift_heights;

Судя по приведенному в вопросе SELECT, вы хотите вывести либо (все
высоты, все ширины), либо (все возможные пары высот и ширин).
Объясните задачу, тогда ответ будет точнее.

A4

unread,
Oct 17, 2007, 11:43:48 AM10/17/07
to ua_mysql
И еще.

IS_NULL "не работает" потому, что вы не ту таблицу им проверяете.

LEFT JOIN расширяет нулами вторую таблицу. (я запомнил для себя так -
раз LEFT, значит левая таблица сильная и остается нетронутой, а правая
- слабая и дает себя расширить).

Следовательно имеет смысл писать IS_NULL( doors_lifts2sizes.lift_id ).
Либо поменять порядок следования таблиц в джойне, но это уже меняет
условия задачи.

Dmitry Polushkin

unread,
Oct 17, 2007, 11:53:23 AM10/17/07
to ua_mysql
С ISNULL тоже самое.

A4

unread,
Oct 17, 2007, 11:57:37 AM10/17/07
to ua_mysql
>С ISNULL тоже самое

Дружище, мы ТВОЮ проблему решаем. Такими рублеными фразами мы далеко
не уедем. Расскажи подробнее.

Dmitry Polushkin

unread,
Oct 17, 2007, 12:06:44 PM10/17/07
to ua_mysql
Задача:

Выбрать все высоты, для lift_id (находится в таблице связке
doors_lifts2). Но проблема в том, что его может в этой таблице связке
и не быть. По этому, я и применяю IS NULL, предполагая, что если
lift_id будет отсутствовать - результаты всёравно выберутся.

Если упростить этот запрос, то мы получим:

ELECT doors_lift_heights.*


FROM doors_lift_heights
LEFT JOIN doors_lifts2sizes USING(lift_height_id)

WHERE lift_id = 9 # lift_id IS NULL
GROUP BY lift_height_id

Dmitry Polushkin

unread,
Oct 17, 2007, 12:13:50 PM10/17/07
to ua_mysql
Стараюсь ответить по порядку :)

A4

unread,
Oct 17, 2007, 12:23:51 PM10/17/07
to ua_mysql
Ага, уже что-то проясняется.

Такой вопрос - зачем приджойнивается `doors_lifts2sizes`, если из неё
никакие данные не используются?

Dmitry Polushkin

unread,
Oct 17, 2007, 12:35:49 PM10/17/07
to ua_mysql
Из неё данные иногда используются, в случае если в ней есть записи по
lift_id.

Dmitry Polushkin

unread,
Oct 17, 2007, 12:39:48 PM10/17/07
to ua_mysql
Упрощённый пример я дал для того, что бы ситуация с запросом стала
более ясна.

В этом запросе используются данные lift_width_id, где они группируются
(join'ятся) в string через запятую.

On Oct 17, 7:23 pm, A4 <I1t...@gmail.com> wrote:

A4

unread,
Oct 17, 2007, 12:53:50 PM10/17/07
to ua_mysql
SELECT doors_lift_heights.*

FROM doors_lift_heights
LEFT JOIN doors_lifts2sizes USING(lift_height_id)
WHERE lift_id = 9 # lift_id IS NULL
GROUP BY lift_height_id

Тогда в принципе это правильный запрос с двумя оговорками:
1. Т.к. doors_lift_heights стоит слева от LEFT JOIN, lift_id всегда
будет не NULL
2. Зачем группировка в конце?


Dmitry Polushkin

unread,
Oct 17, 2007, 1:12:43 PM10/17/07
to ua_mysql
1) почему? Использовать right join?
2) Для того, что бы получить все lift_height_id, а к left_id добавить
все lift_width_id.

Значит если ещё яснее выразиться, у меня логика в WHERE такая, что мне
требуется выбрать все значения lift_width_id, если lift_id = 9, или не
выбирать никакие значения lift_width_id, если lift_id для данного
height_id в таблице связке sizes не были найдены.

Спасибо.

A4

unread,
Oct 17, 2007, 1:29:37 PM10/17/07
to ua_mysql
Попробуй без GROUP BY. Запрос выглядит правильным.

Dmitry Polushkin

unread,
Oct 18, 2007, 4:32:46 AM10/18/07
to ua_mysql
Насамом деле решается всё намного проще:

SELECT doors_lift_heights.*,
GROUP_CONCAT(IF(lift_id = 12, lift_width_id, NULL) ORDER BY
lift_width_to ASC) AS widths


FROM doors_lift_heights
LEFT JOIN doors_lifts2sizes USING(lift_height_id)

LEFT JOIN doors_lift_widths USING(lift_width_id)


GROUP BY lift_height_id
ORDER BY lift_height_to ASC

A4

unread,
Oct 18, 2007, 4:37:26 AM10/18/07
to ua_mysql
Ну ок.

Reply all
Reply to author
Forward
0 new messages