Sql veritabanlarında genelde satır bazlı olarak veri alınır. Yani siz istediğiniz bir veriyi liste halinde görebilirsiniz. Örneğin 4 sütundan oluşan bir tabloda veriler tutulsun. “Select * from TabloAdı” sorgusu çektiğinizde 4 sütun olarak bölümlenmiş şekilde tüm verilerinizi elde edebilirsiniz.

Bazı durumlarda alt alta satır olarak bulunan veriler yan yana yazılmak istenebilir. Bunu bir örnek ile bu yazımızda anlatacağız.

Örnek: Sinema salonu veritabanımızda film, salon ve vizyon isimli tablolar olduğunu varsayalım. Bu tablolarda her film için salon ve seans bilgisi tutulmakta. İlişkisel veritabanı mantığı gereği her veri satır olarak çağrıldığında alınabilmektedir. Yani filmlerin salon ve seans bilgilerini aşağıdaki sql sorgusu ile aldığımızı varsayıyorum.

SELECT  f.adi as filmadi, s.adi as Salon, v.tarih, v.Seans FROM vizyon v
        LEFT JOIN film f ON v.filmid = f.id
        LEFT JOIN salon s ON v.salonid = s.id

Sorgunun çıktısı şu şekilde olacaktır:

Film Adı Salon Tarih Seans
1.Film 1.Salon 28.12.2018 09:00
1.Film 1.Salon 28.12.2018 11:00
1.Film 1.Salon 28.12.2018 13:00
2. Film 2.Salon 20.12.2018 09:00
2. Film 2.Salon 20.12.2018 13:00
2. Film 2.Salon 20.12.2018 18:00

Gördüğünüz gibi veri olarak doğru, teknik olarak doğru ancak kullanıcı dostu diyebileceğimiz bir formatta değil. Örneğin burda 1. film ve 1. Salondaki seansları yan yana görsek, keza 2. film için de aynı şekilde olsa daha güzel bir görüntü olurdu.

Yani şu şekilde görsek:

Film Adı Salon Tarih Seanslar
1.Film 1.Salon 28.12.2018 09:00 – 11:00 – 13:00
2.Film 2.Salon 20.12.2018 09:00 – 13:00 – 18:00

Bunun için sql sorgumuzda GROUP BY ve GROUP_CONCAT fonksiyonlarını kullanacağız. Sql Sorgusu şöyle olmalıdır:

SELECT  f.adi as filmadi, s.adi as salonadi, v.tarih, GROUP_CONCAT(v.seanssaati SEPARATOR " - ") as Seanslar FROM vizyon v
        LEFT JOIN film f ON v.filmid = f.id
        LEFT JOIN salon s ON v.salonid = s.id
        GROUP BY f.adi , s.adi, v.tarih 

GROUP BY ile verileri film adı ve salona göre grupladık. GROUP_CONCAT ile gruplanmış veride geçen seans saatlerini birleştirdik. Birleştirirken aralarına SEPERATOR deyimi ile “-” işareti ekledik. Siz dilerseniz yalnızca boşluk karakteri veya “,” gibi başkaca ayraçlar ekleyebilirsiniz.

Kullanımı GROUP BY ile SUM toplama fonksiyonlarına benziyor ve oldukça kolay. Kolaylıklar dilerim.

Kategoriler: php mysql