Представьте, что это таблицы моей базы данных:

Table #1: child
╔══════════╦═════════════════╦═══════╗
║Child_id  ║Primary key - AI ║ int   ║
╠══════════╬═════════════════╬═══════╣
║parent_id ║Index-Forign_key ║ int   ║
║══════════╬═════════════════╬═══════╣
║title     ║        -        ║varchar║                   
╚══════════╩═════════════════╩═══════╝

Table #2: Paid
╔══════════╦═════════════════╦═══════╗
║Paid_id   ║Primary key - AI ║ int   ║
╠══════════╬═════════════════╬═══════╣
║child_id  ║Index-Forign_key ║ int   ║
║══════════╬═════════════════╬═══════╣
║paid_price║        -        ║int    ║                   
╚══════════╩═════════════════╩═══════╝

Here are my tables value:

Table: child (data)
╔══════════╦══════════╦═══════╗
║ Child_id ║parent_id ║ title ║
╠══════════╬══════════╬═══════╣
║ 1        ║25        ║bla-bla║
║══════════╬══════════╬═══════╣
║ 2        ║25        ║bla-bla║
║══════════╬══════════╬═══════╣
║ 3        ║5         ║bla-bla║
║══════════╬══════════╬═══════╣
║ 4        ║25        ║bla-bla║
╚══════════╩══════════╩═══════╝

 Table: paid (data)
╔══════════╦══════════╦════════════╗
║ Paid_id  ║Child_id  ║ paid_price ║
╠══════════╬══════════╬════════════╣
║ 1        ║1         ║100         ║
║══════════╬══════════╬════════════╣
║ 2        ║2         ║250         ║
║══════════╬══════════╬════════════╣
║ 3        ║1         ║35          ║
║══════════╬══════════╬════════════╣
║ 4        ║1         ║17          ║
╚══════════╩══════════╩════════════╝

У меня есть запрос, который возвращает (получает) все child_id из дочерней таблицы, а затем по этим идентификаторам возвращается сумма pay_price каждого из них.

Это мой запрос:

SELECT child.Child_id, child.parent_id, sum(paid.paid_price)
FROM paid
JOIN child ON child.Child_id = paid.Child_id
WHERE child.parent_id =25
group by child.Child_id, child.parent_id

РЕЗУЛЬТАТ И ДЕМО

Я ХОЧУ ЭТО: теперь мой запрос работает нормально, но когда в таблице оплачено нет child_id, запрос не возвращает его . Я имею в виду, что я хочу, чтобы все child_id были в таблице платно или нет. если они не возвращаются 0 (теперь я думаю, что он нулевой и не возвращает)

Пожалуйста, посмотрите мою демонстрацию (ссылка выше) и убедитесь, что если я введу parent_id = 25, он вернет 2 строки (сумма), потому что child_id = 3 не существует взаплатил и в результате не возвращает

John IP

Ответы (1)

Здесь вам понадобится ЛЕВОЕ СОЕДИНЕНИЕ (и обратное расположение таблиц) или ПРАВОЕ СОЕДИНЕНИЕ, которое встречается реже:

select
  parent.Child_id,
  parent.parent_id,
  coalesce(sum(paid.paid_price), 0)
from
  parent left join paid
  on parent.Child_id = paid.Child_id
where
  parent.parent_id =25
group by
  parent.Child_id,
  parent.parent_id
;

LEFT JOIN вернет все строки из таблицы слева и все совпадающие строки из таблицы справа. Если совпадений нет, столбцы из таблицы справа будут пустыми.

Coalesce вернет первое ненулевое значение, поэтому, если sum () имеет значение null, вместо этого будет возвращено 0.

2022 WebDevInsider