从具有对应关系的表返回行

时间:2018-01-30 20:43:56

标签: mysql sql

我有2张桌子。 .expenses.loans_expense

.expense

+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| title | varchar(255) | NO   |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+

.loans_expense

+------------+---------------+------+-----+---------+----------------+
| Field      | Type          | Null | Key | Default | Extra          |
+------------+---------------+------+-----+---------+----------------+
| id         | int(11)       | NO   | PRI | NULL    | auto_increment |
| loan_id    | varchar(255)  | YES  | MUL | NULL    |                |
| expense_id | int(11)       | YES  | MUL | NULL    |                |
| amount     | decimal(10,2) | YES  |     | NULL    |                |
+------------+---------------+------+-----+---------+----------------+

我想要发生的是返回.expenses的所有行以及来自.loans_expense 的相应值。即使.loans_expense中找不到记录。但是,每当我添加WHERE查询WHERE loans_expense.loan_id = 'some_id'时,如果在loan_id中找不到某个.loans_expense,它就不会返回单行。

我做了一个查询,但未能返回,因为再次出现某个loan_id不存在

SELECT
    `loans_expense`.`id` AS `id`,
    `loans_expense`.`amount`,
    `expenses`.`title`
FROM
    `expenses`
LEFT JOIN `loans_expense` ON `loans_expense`.`expense_id` = `expenses`.`id`
WHERE
    `loans_expense`.`loan_id` = '2018-00001-00001'
GROUP BY
    `expenses`.`id`

我希望它返回以下内容:

当所有loan_id存在时

+------+------------------------+---------+
| id   | title                  | amount  |
+------+------------------------+---------+
|    1 | Rice / Food            | 2121.00 |
|    2 | Basic Bills(Total)     |   21.00 |
|    3 | Rent                   |   12.00 |
|    4 | Tuition                |  121.00 |
|    5 | Loan from Banks(Total) |   21.00 |
|    6 | Others(Total)          |  212.00 |
+------+------------------------+---------+

loan_id不存在时

+------+------------------------+--------+
| id   | title                  | amount |
+------+------------------------+--------+
|    1 | Rice / Food            |        |
|    2 | Basic Bills(Total)     |        |
|    3 | Rent                   |        |
|    4 | Tuition                |        |
|    5 | Loan from Banks(Total) |        |
|    6 | Others(Total)          |        |
+------+------------------------+--------+

某些相关记录中存在loan_id

+------+------------------------+--------+
| id   | title                  | amount |
+------+------------------------+--------+
|    1 | Rice / Food            |        |
|    2 | Basic Bills(Total)     | 500.00 |
|    3 | Rent                   |        |
|    4 | Tuition                | 124.00 |
|    5 | Loan from Banks(Total) |        |
|    6 | Others(Total)          | 147.00 |
+------+------------------------+--------+

1 个答案:

答案 0 :(得分:3)

我想你只想要left join

select e.*, l.amount
from expenses e left join
     loan_expenses le
     on le.expense_id = e.id and le.loan_id = '2018-00001-00001';

请注意loan_id的条件是on子句,而不是where子句。