在3个具有多个一对多表的表上进行SQL JOIN

时间:2019-03-25 19:15:41

标签: sql mysqli

所以,我现在正在努力用SQL查询退出一段时间。
这是我想完成的事情:

假设我们有3个表格:水果,农民和销售量

这些表的结构和填写如下。

水果:

__|_fruit______|_taste_
 1| apple      | sweet
 2| banana     | sweet
 3| grapefruit | sour

农民:

__|_farmer___|_field_____
 1| ben      | apple
 2| mary     | banana
 3| mike     | grapefruit
 4| joanna   | apple
 5| clara    | grapefruit

销售:

__|_fruit______|_amount__
 1| apple      | 50
 2| banana     | 25
 3| apple      | 30
 4| grapefruit | 40
 5| banana     | 45
 6| apple      | 30

我现在希望能够查看卖出了哪些水果以及这些水果中有多少。我可以使用的结果看起来像这样
(其中Fruits.fruit =“苹果”):

fruits.fruit | farmers.farmer | sales.amount
apple        | ben            | 50
apple        | joanna         | 30
apple        | null           | 30

或类似的
(其中Fruits.fruit =“香蕉”):

fruits.fruit | farmers.farmer | sales.amount
banana       | mary           | 25
banana       | null           | 45

或类似的
(其中Fruits.fruit =“ grapefruit”):

fruits.fruit | farmers.farmer | sales.amount
grapefruit   | mike           | 40
grapefruit   | clara          | null

我将这些结果存储在php中,以后可以确定必须向哪个农夫支付多少钱,因为应该就出售量向农夫支付适当的钱。

我只想执行一个SQL查询,而没有一个交叉引用表。
我对问题的处理方法如下(确实失败了):

SELECT fruits.fruit, farmers.farmer, sales.amount
FROM fruits
JOIN farmers ON farmers.field = fruits.fruit
JOIN sales ON sales.fruit = fruits.fruit
WHERE fruits.fruit = "apple"

查询的最后一行必须更改,以便获得先前显示的结果。

在没有交叉引用表的情况下这样做是否合理?
有可能做到吗?
这里有一种完全不同的方法会被首选吗?

预先感谢

EDIT#1:在销售中添加了缺失的条目(6)
EDIT#2:MySQL-版本为5.7.17

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找group by

SELECT fr.fruit, fa.farmer, sum(s.amount)
FROM sales JOIN
     fruits fr
     s.fruit = fr.fruit LEFT JOIN
     farmers fa
     ON fa.field = fr.fruit 
GROUP BY fr.fruit, fa.farmer;

答案 1 :(得分:0)

这将适用于MySql 8.0:

with 
  farmers as (
    SELECT row_number() over ( order by null ) rn, farmer, field from farmers
    WHERE field = 'apple'
  ),    
  sales as (
    SELECT row_number() over ( order by null ) rn, fruit, amount from sales
    WHERE fruit = 'apple'
  )
select s.fruit, f.farmer, s.amount
from sales s left join farmers f
on f.rn = s.rn

请参见demo
结果:

| fruit | farmer | amount |
| ----- | ------ | ------ |
| apple | ben    | 50     |
| apple | joanna | 30     |
| apple | null   | 30     |
为MySql 5.5

编辑

select s.fruit, f.farmer, s.amount
from (
  select (@row_number1:=@row_number1 + 1) AS rn, fruit, amount
  from sales, (select @row_number1:=0) t
  where sales.fruit = 'apple'
) s left join (
  select (@row_number2:=@row_number2 + 1) AS rn, farmer
  from farmers, (select @row_number2:=0) t
  where farmers.field = 'apple'
) f
on f.rn = s.rn

请参见demo