Как правильно соединить две таблицы MySQL с условиями? - PullRequest
2 голосов
/ 19 апреля 2011

У меня возникли некоторые трудности, связанные с этой проблемой.Я уверен, что есть обходной путь, но я пытаюсь использовать один запрос.Я соединяю две таблицы с парой условий.Мне нужно вернуть все строки, соответствующие 't_id' (даже если NULL).Мне также нужно присоединить только данные, соответствующие 'e_id'.Если 'e_id' не существует, он должен вернуть NULL.Следующий запрос возвращает все нужные мне строки:

SELECT b.*, ev.* FROM blocks b 
LEFT OUTER JOIN element_values ev ON ev.b_id = b.id
WHERE t_id = 1;

+----+------+-----------+-----+------+------+-----------------+
| id | t_id | type      | pos | e_id | b_id | value           |
+----+------+-----------+-----+------+------+-----------------+
|  1 |    1 | textinput |   1 |    1 |    1 | this is it edit |
|  2 |    1 | textinput |   0 |    1 |    2 | what is it      |
|  5 |    1 | template  |   2 | NULL | NULL | NULL            |
+----+------+-----------+-----+------+------+-----------------+

Но добавление еще одного условия для 'e_id' вернет точные данные, но исключит третью строку, если она NULL (конечно).

SELECT b.*, ev.* FROM blocks b 
LEFT OUTER JOIN element_values ev ON ev.b_id = b.id
WHERE t_id = 1 AND e_id = 1;

+----+------+-----------+-----+------+------+-----------------+
| id | t_id | type      | pos | e_id | b_id | value           |
+----+------+-----------+-----+------+------+-----------------+
|  1 |    1 | textinput |   1 |    1 |    1 | this is it edit |
|  2 |    1 | textinput |   0 |    1 |    2 | what is it      |
+----+------+-----------+-----+------+------+-----------------+

Я ищу решение, в котором все три строки все еще возвращаются, если 'e_id' не существует.Например, при последнем запросе, когда я передаю 'e_id = 2', набор будет пустым.Но мне нужно, чтобы он по-прежнему возвращал все строки, равные 't_id'.

Любые мысли полезны.

Спасибо!

1 Ответ

3 голосов
/ 19 апреля 2011

Вы можете ввести e_id = 1 в предложении LEFT JOIN, чтобы получить нужные вам строки.

Измените ваш запрос следующим образом:

SELECT b.*, ev.* 
  FROM blocks b  LEFT OUTER JOIN element_values ev 
    ON ev.b_id = b.id 
   AND e_id = 1
 WHERE t_id = 1; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...