Merhaba,
--------------------------------
MySQL Tablosu
id: 1
ad : Küçük Sepet
kapasite: 2
-----
id: 2
ad: Orta Sepet
kapasite: 5
-----
id: 3
ad: Büyük Sepet
kapasite: 8
----------------------------------
Düşünelim ki elimizde sepetlerimiz var ve bunlarında farklı kapasiteleri var. Mesela; Küçük Sepet 2 elma alıyor, Orta Sepet 5 elma alıyor, Büyük Sepet 8 elma alıyor.
Şimdi elimizde bir form var ve burada sadece ne kadar sepet ihtiyacımız olacağını bize sunacak. Bu formda sadece elma sayısını girdiğimiz bir input var.
Bu inputa ne sayı girersek bu kadar elmayı hangi sepete sığdırabileceğimizi gösteriyor. where sorgusunda where($kapasite, '>=', $elma_sayisi) şeklinde.
Benim istediğim sığmadığı sepetide kaç tane sepet gerekiyorsa göstermesi.
Mesela 4 elma girildiğinde sadece Orta ve Büyük sepetler olur diyor ama Küçük sepetten 2 tane diyede sonuca eklemesini istiyorum.
Bu sorguyu nasıl yaparım laravel kullanılmış php ile kapasite yetersizse daha fazla sepet seçmesinide sağlayabilirmiyim?
Umarım anlatabilmişimdir,
Teşekkürler iyi forumlar.
MySQL'da böyle bir sorgu nasıl yapılır?
2
●403
- 15-03-2017, 23:19:08Selamlar,
İ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.
UlusLab adlı üyeden alıntı: mesajı görüntüle - 16-03-2017, 00:07:47Üyeliği durdurulduÇok teşekkür ediyorum zaman ayırdığınız için parmaklarınıza sağlık.reddoc adlı üyeden alıntı: mesajı görüntüle