所以,我现在正在努力用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
答案 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