SELECT
yorumlar.id,
yorumlar.yorum,
sum(case when begeniler.tip = '0' then 1 else 0 end) as dislike,
sum(case when begeniler.tip = '1' then 1 else 0 end) as like
FROM
yorumlar
LEFT JOIN
begeniler ON yorumlar.id = begeniler.yorum_id
GROUP BY yorumlar.id, yorumlar.yorum
ORDER BY id ASC
// Laravel Versiyonu
DB::table('yorumlar')
->select(
'yorumlar.id',
'yorumlar.yorum',
DB::raw("sum(case when begeniler.tip = '0' then 1 else 0 end) as dislike"),
DB::raw("sum(case when begeniler.tip = '1' then 1 else 0 end) as like")
)
->leftJoin('begeniler', 'yorumlar.id', '=', 'begeniler.yorum_id')
->groupBy('yorumlar.id','yorumlar.yorum')
->orderBy('id','ASC')
->get();denedim.

tablo ve kolon isimleri tutmayabilir kendinize göre düzenleyin.
Siz sorgunuzu nasıl yazdınız bilmiyorum ama burada count yaparsanız istediğiniz sonucu alamazsınız bir çok subquery yani alt sorgu yazmanız gerekir.
Count size satır sayısını döndürür. Örneğin
SELECT COUNT('begeniler.tip') as dislike WHERE begeniler.tip = 0 bu sorgu size dislike sayısını verecek ama like için aynısını yeniden yazmanız gerekecek bunları joinle birleştirecek falan feşmekan.. Bu iş olmuyor böyle.
Sum ile yaptığımız işlem,
SUM(CASE WHEN begeniler.tip = "0" THEN 1 ELSE 0 END) as dislike
burada aslında sayıyoruz ama manuel sayıyoruz. Yani diyoruz ki beğenilerin tipi 0 ise bu kolonun değerini 1 olarak gör ve tüm satırlarda bu şekilde olanları topla.
Diğerinde de beğenilerin tipi 1 ise bu kolonu 1 olarak gör tüm satırlarda bu şekilde olanları topla. Sonucu bu şekilde elde ediyoruz.
SUM(CASE WHEN begeniler.tip = "0" THEN 1 ELSE 0 END) as dislike
kırmızıya boyadığım 0 sizi aldatmasın. Orada siz mesela varchar kullanmış olsaydınız ve tip = 0 yerine tip = dislike demiş olsaydınız sorguyu şöyle yapabilirdiniz.
SUM(CASE WHEN begeniler.tip = "dislike" THEN 1 ELSE 0 END) as dislike
böylece siz tip'i dislike olan hücrelerin değerini 1 olarak algıla ve sonra bu hücreleri topla demiş olacaktınız. Mantık bu.
İyi forumlar.
merhaba,
2 adet subquery yapıldığı durumda
SELECT
yorumlar.id,
yorumlar.yorum,
(SELECT COUNT(*) as dislike WHERE begeniler.yorum_id=yorumlar.yorum_id begeniler.tip = '0') as a,
(SELECT COUNT(*) as dislike WHERE begeniler.yorum_id=yorumlar.yorum_id begeniler.tip = '1') as b...
ve sizin yazdığınız join işlemi gerçekleştirip sum ile yaptığınız hesaplama sorgularının analiz sonuçlarına göre değerlendirip "...falan feşmekan.. Bu iş olmuyor böyle." yorumunu yaparsak daha doğru olur.
https://dev.mysql.com/doc/refman/5.7/en/explain.html
en basitinden explain sorgularını ekleyin beraber inceleyelim.
analiz için minunum 20 satır ve beğeni sayısı 20 satır için 500-1000 adet beğeni/beğenmeme durumları olsun. kesin yorumu beraber yapalım.
iyi çalışmalar
Laradan titana çevirdim başka bi sebepten dolayı;
$comments = Model::run('Comments')->type('series')->db()
->select("comments.*,users.*,series.*,sum(case when comments_like.like_type = '0' then 1 else 0 end) as dislike,sum(case when comments_like.like_type = '1' then 1 else 0 end) as likes")
->innerJoin('users', 'comments.user_id=users.user_id')
->innerJoin('series', 'comments.post_id=series.series_id')
->leftJoin('comments_like', 'comments.id=comments_like.comment_id')
->groupBy('comments.id')
->orderBy('comments.id', 'DESC')
->getAll();SELECT comments.*,users.*,series.*,sum(case when comments_like.like_type = '0' then 1 else 0 end) as dislike,sum(case when comments_like.like_type = '1' then 1 else 0 end) as likes FROM comments INNER JOIN users ON comments.user_id=users.user_id INNER JOIN series ON comments.post_id=series.series_id LEFT JOIN comments_like ON comments.id=comments_like.comment_id WHERE comments.type='series' GROUP BY comments.id ORDER BY comments.id DESC
Yok hocam baz alamadık. Baz olarak comments_like alanını alıyor. kafayı kırdım iyice
@CoreDeluxe; seninkide baz olarak likes ı alıyor;
SELECT comments.*,users.*,series.*,(SELECT COUNT(*) as dislike FROM comments_like WHERE comments_like.comment_id=comments.id AND comments_like.like_type = 0) as aa,
(SELECT COUNT(*) as dislike FROM comments_like WHERE comments_like.comment_id=comments.id AND comments_like.like_type = 1) as bb FROM comments INNER JOIN users ON comments.user_id=users.user_id INNER JOIN series ON comments.post_id=series.series_id LEFT JOIN comments_like ON comments.id=comments_like.comment_id WHERE comments.type='series' GROUP BY comments.id ORDER BY comments.id DESC