ztk adlı üyeden alıntı: mesajı görüntüle
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.
ztk adlı üyeden alıntı: mesajı görüntüle
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.
CoreDeluxe adlı üyeden alıntı: mesajı görüntüle
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