Предотвращение сбоя всего запроса JOINed MYSQL, если в предложении WHERE отсутствует одно поле - PullRequest
1 голос
/ 12 марта 2010

Я делаю пару соединений с переменной в предложении WHERE. Я не уверен, что я делаю все так эффективно, как мог, или даже использую лучшие практики, но моя проблема в том, что половина моих таблиц содержит данные, когда tableC.type = 500 , а другая половина не приводит к сбою всего запроса.

SELECT tableA.value1 , tableB.value2, tableC.value3 FROM tableA  
JOIN tableB ON  tableB.id=tableA.id
JOIN tableC ON  tableC.id=tableB.id
WHERE tableA.category=$var && tableC.type=500;

Я бы хотел получить tableA.value1 и tableB.value2 , даже если в tableC нет поля с Тип = 500 . * * 1014 Какие-нибудь мысли? я совершенно в тупик, как подойти к этому ...

Ответы [ 2 ]

4 голосов
/ 12 марта 2010
SELECT tableA.value1 , tableB.value2, tableC.value3 FROM tableA  
JOIN tableB ON  tableB.id=tableA.id
LEFT JOIN tableC ON  tableC.id=tableB.id AND tableC.type=500
WHERE tableA.category=$var;

[INNER] JOIN (который у вас есть) присоединяется, только если значения существуют;

LEFT JOIN возвращает NULL для столбцов tableC, если не найдено подходящей строки в tableC.

Я думаю, что необходимо переместить условия tableC в условие ON при использовании LEFT JOIN, так как WHERE отфильтровывает значения NULL (так как tableC.type IS NULL! = 500).

0 голосов
/ 12 марта 2010

Попробуйте LEFT JOIN

...