MySQL加入三个表,如果为null则显示0

时间:2017-06-21 08:15:17

标签: php mysql sql

我有三张桌子:

  

person_table

     

ID |名字|性别

     

1 |乔|雄性

     

2 |简|女

     

3 |珍妮特|女

     

4 |杰伊|男   等...

  

product_table

     

ID |名字

     

1 |杂志

     

2 |书

     

3 |论文

     

4 |新颖

     等等......

  

** person_product

     

为person_id | product_id |数量

     

1 | 1 | 1

     

1 | 3 | 3

     

2 | 3 | 1

     

4 | 4 | 2

     等等......

我试图创建一个返回如下表格的查询: 为person_id | person_name | PRODUCT_NAME |数量 但我不能这样做,如果让我们说约翰没有书,它应该显示 (johns id)约翰|书| 0 而不只是跳过这一行。 我哪里做错了? 这是我设法提出的:

SELECT p.*, f.name, l.quantity 
FROM person_product AS l 
INNER JOIN people_table AS p ON l.person_id=p.id 
INNER JOIN product_table AS f ON l.product_id=f.id
ORDER BY id`

3 个答案:

答案 0 :(得分:2)

您似乎正在生成所有人员的报告,而所有产品的相关数量;在大型数据集上,这可能需要一段时间,因为您没有专门为数量以外的任何人加入产品:

SELECT
p.id,
p.name,
p.gender,
f.name,
IFNULL(l.quantity,0) AS quantity

FROM person_table AS p

JOIN product_table AS f

LEFT JOIN person_product AS l
    ON l.person_id = p.id
    AND l.product_id = f.id

ORDER BY p.id, f.name

结果是:

enter image description here

这或多或少是你所追求的吗?

答案 1 :(得分:1)

你需要从people_table开始,而不是使用左连接,你需要带来其他表数据。

如果你需要0值,你可以使用函数IFNULL

SELECT p.*, f.name, IFNULL(l.quantity,0)
FROM people_table AS p
LEFT JOIN  person_product AS l  ON l.person_id=p.id
LEFT JOIN product_table AS f ON l.product_id=f.id
ORDER BY p.id

答案 2 :(得分:0)

如果没有书不应出现在表格中,请尝试(易于理解):

SELECT NAME
    ,'0'
    ,'0'
FROM person_table
WHERE id NOT IN (
        SELECT person_id
        FROM person_product
        )

UNION

SELECT person_id
    ,product_id
    ,quantity
FROM person_product;