Group Concat!
İyi kötü 11 yıldır PHP-MySQL-PostgreSQL ile uğraşıyorum. Binlerce kez tablo şeklinde listeler hazırlamışımdır; sipariş listesi, müşteri listesi gibi. Genel olarak benzese de aslında sipariş listesi ile müşteri listesi ayrı yapıdadır. Müşteri listesi tek tablodan ibaret olabilir. Müşterinin adı, soyadı, adresi, telefonu vs. Bunları alt alta listelemekte hiçbir beis yok. Ama sipariş listesi öyle değildir. Siparişin genel bilgilerinin (sipariş tarihi, siparişi veren müşterinin id’si, siparişin durumu vs) yanısıra bir de o siparişte geçen ürünlerin id, adet ve belki o anki satış fiyatlarının tutulduğu ayrı bir tablo vardır. İç içe query’ler olmasın, kullanıcının da kafası karışmasın diye sipariş listesini oluştururken sadece sipariş genel tablosundaki bilgileri ekrana basar, en çoğu bu siparişte şu kadar ürün vardır diye bir count() bilgisi koyarız.
Halbuki hemen her müşteri de şunu ister; yahu burda siparişler güzel görünüyor da, hangi ürünleri almış görmek için illa sipariş detaylarına tıklamam gerekiyor. Biz de ahkam keseriz “ee aksi halde burda her sipariş için n tane satır görmen gerekecek, daha karışık bir ekran olacak bıdı bıdı bıdı”..
Halbuki siparişlerin çoğunda ya bir ürün var ya iki. Ekranda basmak bile problem oluşturmayacak ama o iç içe querylerle sistemi yormamak ya da topluca çok satır getirecek şekilde çekip php ile tabloyu düzeltmek zahmetine girmeyecek bir şey olsa.. sum() gibi.. sum() madem bir sütundaki rakamları toplayabiliyor, yok mu concat()’ın sum() gibi olanı..
Olmaz mı.. Olur elbet. Sen bu soruyu 11 sene önce sorsaydın ya akıllım.
Efendim, çektiğim sancıları yukarıda anlatıp size de aynı sancıları çektirebildiysem ne ala 🙂 Öyle peşin peşin aha burdan böyle yapılıyor diyecek değildim 🙂
Belki benim gibi tanımayanlar vardır diye çok geç tanıştığım group_concat() ile sizleri tanıştırayım. Kendisi mySQL komutudur ama eminim diğer SQL dillerinde de muadilleri vardır.
Gayet kolay kullanılıyor. Klasik group by ifadenizi yazıyorsunuz, select kısmına group_concat(yanyana_gelecek_sutun_adi) şeklinde ifadeyi ekliyorsunuz. Örnek:
select s.id, s.musteri_id,s.tarih,s.durum_kodu, group_concat(u.urun_adi)
from tbl_siparis s
left join tbl_siparis_urun u on u.id=s.urun_id
Daha detaylı yazmak isterseniz:
select s.id, s.musteri_id,s.tarih,s.durum_kodu, group_concat(u.urun_adi order by u.urun_adi separator ‘, ‘)
from tbl_siparis s
left join tbl_siparis_urun u on u.id=s.urun_id