3 таблицы, левое соединение, в случае отсутствия ДАННЫХ в ОДНОЙ таблице - PullRequest
1 голос
/ 07 февраля 2011

table1 (идентификаторы всегда существуют)

+----+------+
| id | col1 |
+----+------+
| 1  |  ab  |
+----+------+
| 2  |  gh  |
+----+------+

table2 (идентификаторы всегда существуют)

+----+------+
| id | col2 |
+----+------+
| 1  |  cd  |
+----+------+
| 2  |  ij  |
+----+------+

table3 (идентификаторы могут отсутствовать, в этом случае 2 отсутствует)

+----+------+
| id | col3 |
+----+------+
| 1  |  ef  |
+----+------+

PHP

$col = 'ab';

$a = mysql_query("SELECT t1.id FROM table1 AS t1, table2 AS t2, table3 AS t3
WHERE t1.id = t2.id AND t2.id = t3.id AND (t1.col1 = '$col' OR t2.col2 = '$col'
OR t3.col3 = '$col) GROUP BY t1.id, t2.id, t3.id");

Это сработало бы, только если во всех трех таблицах был включен "один и тот же идентификатор", но что произойдет, если по какой-то причине в table3 отсутствует "id"? Как я могу все еще проверить все три таблицы и получить t1.id для вывода 1, когда $ col = ab ? я должен был бы использовать левое соединение ?

$a = mysql_query("SELECT t1.id FROM table1 AS t1, table2 AS t2 
LEFT JOIN (SELECT id FROM table3 WHERE col3 = '$col') AS t3 ON t3.id = t1.id 
WHERE t1.id = t2.id AND (t1.col1 = '$col' OR t2.col2 = '$col')
GROUP BY t1.id, t2.id");

что я тут не так делаю?

Ответы [ 2 ]

1 голос
/ 07 февраля 2011

Что ты делаешь не так?Запрос к таблице, которая не существует.Это всегда вызывает ошибку.

Я не собираюсь говорить о целесообразности создания базы данных, в которой таблицы, важные для ваших запросов, приходят и уходят.

Ваша единственная надежда на стороне клиента -

  • проверяет наличие интересующих вас таблиц, и
  • выполняет различные SQL-операторы на основе этих результатов.


[После редактирования]

Звучит так, будто вам нужно одно или два левых внешних соединения.Это дает вам все идентификаторы, которые являются общими для таблиц1 и таблиц2, независимо от того, находятся ли они в таблице 3.

select t1.id, t2.id, t3.id
from table1 t1
inner join table2 t2 on (t1.id = t2.id)
left join table3 t3 on (t1.id = t3.id);

И это дает вам все идентификаторы в таблице1, независимо от того, являются ли онив таблице 2 или таблице 3.

select t1.id, t2.id, t3.id
from table1 t1
left join table2 t2 on (t1.id = t2.id)
left join table3 t3 on (t1.id = t3.id);

И, конечно же, вы можете фильтровать результаты с помощью предложения WHERE.

0 голосов
/ 07 февраля 2011

LEFT JOIN работает только тогда, когда таблица существует, но не содержит данных.

Если вы не хотите делать что-то вроде Catcall предложил (проверьте, существует ли таблицаи использовать различные операторы SQL, основанные на этом ...) вы должны убедиться, что таблица существует в базе данных, даже если она полностью пуста.

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

Если это действительно большая проблема (например, вы не можете быть уверены, что кто-то удалил таблицу), выможет проверять это каждый раз при запуске приложения: создайте таблицу, если она не существует.

...