MySQL SELECT, если он не нулевой

Я пытаюсь сделать запрос, в котором используются 3 таблицы. Первый, table1, используется для хранения значений идентификаторов для table2 и table3, а также некоторых других данных. В некоторых случаях значения не хранятся ни в таблице 2, ни в таблице 3, в некоторых случаях используется одно или другое, а в некоторых — и то, и другое.

Проблема в том, что когда нет значений ни в таблице 2, ни в таблице 3, SQL пытается найти значения NULL следующим образом:

SELECT table1.id, table2value, table3value
FROM table1, table2, table3
WHERE table1value1 = table2.id AND table1value2 = table3.id;

Таким образом, в этом запросе, если table1value1 или table1value2 имеют значение NULL, запрос не будет работать, поскольку это явно недействительная ссылка. Поэтому мне интересно, как я могу найти только те значения, которые существуют.


person The Thirsty Ape    schedule 05.09.2012    source источник


Ответы (6)


Вместо этого используйте INNER JOIN. Он объединяет таблицы вместе с условием существующих данных во всех таблицах. В противном случае эта строка не будет возвращена.

SELECT table1.id, table2.value, table3.value
FROM table1
INNER JOIN table2
ON table1.value1 = table2.id
INNER JOIN table3
ON table1.value2 = table3.id;

Но если вам требуется, чтобы только одна из этих двух строк имела существующие данные, вы можете сделать следующее:

SELECT table1.id, table2.value, table3.value
FROM table1
LEFT JOIN table2
ON table1.value1 = table2.id
LEFT JOIN table3
ON table1.value2 = table3.id;
WHERE table2.id IS NOT NULL OR table3.id IS NOT NULL
person Robin Castlin    schedule 05.09.2012
comment
Большое спасибо, вторая часть вашего ответа была именно тем, что я искал. - person The Thirsty Ape; 05.09.2012

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

SELECT table1.id, table2value, table3value
FROM table1 inner join table2 on  table1value1 = table2.id
inner join table3 on table1value2 = table3.id;
person sel    schedule 05.09.2012

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

SELECT table1.id, table2.value, table3.value
FROM   table1 
          INNER JOIN table2
             ON table1.value1 = table2.id
          INNER JOIN table3
             ON table1.value2 = table3.id;
person John Woo    schedule 05.09.2012

попробуй это:

SELECT table1.id, 
       table2value,
       table3value
FROM   table1
JOIN   table2
ON     table1value1 = table2.id
JOIN   table3
ON     table1value2 = table3.id;
person Joe G Joseph    schedule 05.09.2012

Как насчет ВНУТРЕННЕГО СОЕДИНЕНИЯ?

SELECT table1.id, table2value, table3value
FROM table1 INNER JOIN table2 ON table1.value1 = table2.id, 
INNER JOIN table3 ON table1.value2 = table3.id;
person rkosegi    schedule 05.09.2012

Вы должны использовать INNER JOIN.

SELECT table1.id, table2value, table3value
FROM table1 
    INNER JOIN table2 ON table1value1 = table2.id
    INNER JOIN table3 ON table1value2 = table3.id;
person Himanshu Jansari    schedule 05.09.2012