Операции нормального присваивания просто указывают новую переменную на существующий объект. docs объясняют разницу между неглубокими и глубокими копиями:
Разница между мелким и глубоким копированием применима только для составных объектов (объектов, которые содержат другие объекты, например списки или экземпляры класса):
blockquote>
- Неглубокая копия создает новый составной объект и затем (насколько это возможно) вставляет ссылки в него в объекты, найденные в оригинале.
- Глубокая копия создает новый составной объект, а затем рекурсивно вставляет в него копии объектов, найденных в оригинале.
Вот небольшая демонстрация:
import copy a = [1, 2, 3] b = [4, 5, 6] c = [a, b]
Использование операций нормального присваивания для копирования:
d = c print id(c) == id(d) # True - d is the same object as c print id(c[0]) == id(d[0]) # True - d[0] is the same object as c[0]
Использование мелкой копии:
d = copy.copy(c) print id(c) == id(d) # False - d is now a new object print id(c[0]) == id(d[0]) # True - d[0] is the same object as c[0]
Использование глубокой копии:
d = copy.deepcopy(c) print id(c) == id(d) # False - d is now a new object print id(c[0]) == id(d[0]) # False - d[0] is now a new object
Я думаю, что вы ищете 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;
Это будет работать для 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
| fruit | farmer | amount |
| ----- | ------ | ------ |
| apple | ben | 50 |
| apple | joanna | 30 |
| apple | null | 30 |
Редактировать [ 1110] для 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