[mysql] запрос из 2х таблиц. если нет данных во 2 таблице, поставить ноль

Тема в разделе "Базы данных", создана пользователем dandandan, 16 фев 2012.

Модераторы: latteo
  1. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    267
    Есть 2 таблицы (на самом деле кол-во колонок гораздо больше).

    table1.id и table2.id_tovar - связанные столбцы.

    Нужно получить все товары из table1 и цены к ним из таблицы 2. Если в таблице 2 отсутствует цена для такого id товара, то в строке подставить "ноль"

    Сейчас запрос делаю так:

    PHP:
    SELECT a.tovara.idb.cena
    FROM table1 a
    ,
            
    table2 b
    WHERE a
    .id=b.id_tovar
    В результате теряется из таблицы 1 строка с идентификатором id = 4, а надо, чтобы она тоже выводилась и при этом в таблице цена было значение = 0 (т.к. в таблице2 отсутствует строка с ценой.).

    p.s. Просьба НЕ ПРЕДЛАГАТЬ объединить таблицы в одну. На самом деле в таблицах сложная взаимосвязь.
     
  2. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    114
    Симпатии:
    486
    :facepalm:

    Код:
    SELECT a.tovar, a.id, b.cena
        FROM `table1` AS a
            LEFT JOIN `table2` AS b ON (a.id = b.id_tovar)
    Так не вариант?
     
    dandandan нравится это.
  3. dandandan

    dandandan

    Регистр.:
    7 авг 2008
    Сообщения:
    990
    Симпатии:
    267
    Подходит, только возвращает не число 0, а NULL

    Остался вопрос какие из параметров писать в ON ( тут ) и какие после WHERE тут ?
    Поправьте, если неправильно напишу. В ON писать параметры, которые объединяют таблицы, а в WHERE только те, в которых задаются условия выборки без объединения таблиц.
     
  4. Viodele

    Viodele Механик

    Administrator
    Регистр.:
    17 дек 2011
    Сообщения:
    114
    Симпатии:
    486
    Код:
    SELECT a.tovar, a.id, IF (b.cena IS NULL, 0, b.cena) AS cena
        FROM `table1` AS a
        LEFT JOIN `table2` AS b ON (a.id = b.id_tovar)
    Как-то так. Хотя, для php null - не критично. Сам при конвертировании скинул бы в ноль.
     
    dandandan нравится это.
  5. Antony_

    Antony_ Писатель

    Регистр.:
    21 фев 2012
    Сообщения:
    4
    Симпатии:
    0
    SELECT a.tovar, a.id, case WHEN b.cena IS NULL then 0 ELSE b.cena END
    FROM `table1` AS a
    LEFT JOIN `table2` AS b ON (a.id = b.id_tovar)