Selamlar,
İstediğin gibi bir şey MySQL'de bir fonksiyon içerisinde sonuçları bir tabloya yazdırıp daha sonra da o tabloyu okuyarak yaptırmak mümkün, ama benim hem sevmediğim hem de tercih etmediğim bir yöntem. Fonksiyonları sonuç olarak veri kümesi/tablo dönebilen daha gelişmiş veritabanlarında bunu bir fonksiyon ile yapmak veya recursive sorgu desteği olan bir veritabanında yapmak çok daha kolay olur.
İşine yarar ise aşağıdaki sorgu sana girdiğin elma sayısına göre hangi sepetten kaç adet gerekğini listeleyecektir. Recursive sorgu olmadığı için bunu MySQL'e yaptırmak için biraz arkadan dolaşmak gerekiyor.
Öncelikle katsayi_tablosu adında bir tablo oluşturuyoruz, bu tablo sadece 1,2,3,4... şeklinde sayı dizisi tutuyor.
mysql> select * from katsayi_tablosu;
+----+
| ks |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
| 17 |
| 18 |
| 19 |
| 20 |
| 21 |
| 22 |
| 23 |
+----+
23 rows in set (0.01 sec)
Bir de sepet tablosu var, ondaki veriler de aşağıdaki gibi.
mysql> select * from sepet;
+------+----------------+----------+
| id | ad | kapasite |
+------+----------------+----------+
| 1 | Küçük sepet | 2 |
| 2 | Orta sepet | 5 |
| 3 | Büyük sepet | 8 |
+------+----------------+----------+
3 rows in set (0.00 sec)
Aşağıdaki sorgu içerisindeki @elma := 130 sayısını ihtiyaca göre değiştirerek kaç elma için kaç sepet gerektiğini bulabilirsin.
SELECT id,
ad,
kapasite,
Sum(adet)
FROM (SELECT id,
ad,
kapasite,
ks - @katsayi AS adet,
@elma := @elma - ( ks - @katsayi ) * kapasite,
@katsayi := ks
FROM (SELECT *
FROM sepet
ORDER BY kapasite ASC) s_sort,
(SELECT ks
FROM katsayi_tablosu
ORDER BY ks ASC) k_sort,
(SELECT @katsayi := 0,
@elma := 2) init
WHERE @elma > 0
AND ( ( @elma >= ( ks - @katsayi ) * kapasite
AND @elma <= ( ks - @katsayi + 1 ) * kapasite )
OR ( @elma <= ( ks - @katsayi ) * kapasite ) )) hesaplama
GROUP BY id
HAVING Sum(adet) > 0
ORDER BY kapasite DESC;Örneğin 130 elma için sonuç aşağıdaki gibi
+------+----------------+----------+-----------+
| id | ad | kapasite | Sum(adet) |
+------+----------------+----------+-----------+
| 3 | Büyük sepet | 8 | 16 |
| 1 | Küçük sepet | 2 | 1 |
+------+----------------+----------+-----------+
2 rows in set (0.00 sec)
43 elma için de aşağıdaki gibi
+------+----------------+----------+-----------+
| id | ad | kapasite | Sum(adet) |
+------+----------------+----------+-----------+
| 3 | Büyük sepet | 8 | 5 |
| 1 | Küçük sepet | 2 | 2 |
+------+----------------+----------+-----------+
2 rows in set (0.00 sec)
46 elma için
+------+----------------+----------+-----------+
| id | ad | kapasite | Sum(adet) |
+------+----------------+----------+-----------+
| 3 | Büyük sepet | 8 | 5 |
| 2 | Orta sepet | 5 | 1 |
| 1 | Küçük sepet | 2 | 1 |
+------+----------------+----------+-----------+
3 rows in set (0.00 sec)
İyi çalışmalar.