Есть таблица 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
Заранее благодарен!
Вопрос: требуется выбрать все данные из таблицы doors_lift_heights
внезависимости от того, есть ли в doors_lifts2sizes что-нибудь по
lift_id или нет
Ответ: SELECT * FROM doors_lift_heights;
Судя по приведенному в вопросе SELECT, вы хотите вывести либо (все
высоты, все ширины), либо (все возможные пары высот и ширин).
Объясните задачу, тогда ответ будет точнее.
IS_NULL "не работает" потому, что вы не ту таблицу им проверяете.
LEFT JOIN расширяет нулами вторую таблицу. (я запомнил для себя так -
раз LEFT, значит левая таблица сильная и остается нетронутой, а правая
- слабая и дает себя расширить).
Следовательно имеет смысл писать IS_NULL( doors_lifts2sizes.lift_id ).
Либо поменять порядок следования таблиц в джойне, но это уже меняет
условия задачи.
Дружище, мы ТВОЮ проблему решаем. Такими рублеными фразами мы далеко
не уедем. Расскажи подробнее.
Выбрать все высоты, для 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
Такой вопрос - зачем приджойнивается `doors_lifts2sizes`, если из неё
никакие данные не используются?
В этом запросе используются данные lift_width_id, где они группируются
(join'ятся) в string через запятую.
On Oct 17, 7:23 pm, A4 <I1t...@gmail.com> wrote:
Тогда в принципе это правильный запрос с двумя оговорками:
1. Т.к. doors_lift_heights стоит слева от LEFT JOIN, lift_id всегда
будет не NULL
2. Зачем группировка в конце?
Значит если ещё яснее выразиться, у меня логика в WHERE такая, что мне
требуется выбрать все значения lift_width_id, если lift_id = 9, или не
выбирать никакие значения lift_width_id, если lift_id для данного
height_id в таблице связке sizes не были найдены.
Спасибо.
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