2010-11-17 3 views
1

У меня есть следующий оператор, и он отлично работает, за исключением того факта, что если в 2-й таблице нет ссылочных позиций в первую таблицу, он не вернет никаких результатов.sql запрос для возврата 0 вместо NULL

Что мне нужно его вернуть count(p.match_id) AS matchcount в 0

"SELECT c.*, count(p.match_id) AS matchcount 
    FROM ci_address_book c LEFT JOIN ci_matched_sanctions p 
    ON c.id = p.addressbook_id 
    GROUP BY p.addressbook_id ORDER BY c.id LIMIT ".$offset.",".$num; 

ответ

1

Первая проблема здесь состоит в том, что вы используете LEFT JOIN. Это означает, что все строки в c будут возвращены, даже если они не соответствуют строкам в p.

Ваша проблема.

если вторая таблица не имеет опорных элементов в первой таблице не будет возвращать никаких результатов

Позвольте мне перефразировать это своими словами.

если р таблица не имеет опорные элементы в таблице с он не возвращает никаких результатов

Когда вы делаете LEFT JOIN, все в таблице «правильный», который пустой будет возвращен со значениями NULL. Таким образом, в этих случаях значение match будет «NULL». (Вы можете испытания это, делая select c.*, p.* ... where p.addressbook_id = NULL)

Чтобы отобразить «0» вместо того, чтобы сделать следующее:

SELECT c.*, COALESCE(COUNT(p.match_id), 0) AS matchcount

COALESCE возвращает первое ненулевое значение. Поэтому, когда значение COUNT (p.match_id) равно NULL, вы получаете 0.

+0

частично верно ... мой оператор {"SELECT c. *, COALESCE (COUNT (p.match_id), 0) AS matchcount FROM ci_address_book c LEFT OUTER JOIN ci_matched_sanctions p ON c.id = p.addressbook_id GROUP BY p.addressbook_id ORDER BY c.id LIMIT ". $ Offset.", ". $ Num;} ... это даст мне только количество результатов назад как и в таблице сопоставленных_расходов. В моей адресной таблице есть 80 имен. если matched_sanctions не имеет никакой строки, я ничего не получаю. если он имеет 1, я получаю 1, если он имеет 2, я получаю 2 и т. д. ... – renevdkooi

+0

может быть перефразирован мой q. У меня есть таблица с именами (адресная книга), и у меня есть таблица, содержащая совпадения. Реферируется идентификатором. так что это отношение 1-много. Я хотел бы подсчитать количество строк в сопоставленной таблице, пока получаю все результаты адресной книги. Поэтому я хотел бы видеть: addressbook_id: 1 - name - count – renevdkooi

+0

SELECT c. *, IFNULL (p.total, 0) num FROM ci_address_book c LEFT JOIN (SELECT addressbook_id, COUNT (*) AS total FROM ci_matched_sanctions GROUP BY addressbook_id) AS p ON c.id = p.addressbook_id сделал трюк – renevdkooi

Смежные вопросы