মাইএসকিউএল ক্যোয়ারিতে আইএফ শর্তে গণনা করুন


115

আমার দুটি টেবিল রয়েছে, একটি খবরের জন্য এবং অন্যটি মন্তব্যগুলির জন্য এবং আমি যার মন্তব্যে অনুমোদিত হিসাবে সেট করা হয়েছে তার মন্তব্যের গণনা পেতে চাই।

SELECT
    ccc_news . *, 
    count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments
FROM
    ccc_news
    LEFT JOIN
        ccc_news_comments
    ON ccc_news_comments.news_id = ccc_news.news_id
WHERE
    `ccc_news`.`category` = 'news_layer2'
    AND `ccc_news`.`status` = 'Active'
GROUP BY
    ccc_news.news_id
ORDER BY
    ccc_news.set_order ASC
LIMIT 20 

তবে এই ক্যোয়ারিতে সমস্যাটি হ'ল মন্তব্য কলামের জন্য প্রাপ্ত ন্যূনতম মানটি 1 হ'ল সেই সংবাদের সাথে সম্পর্কিত কোনও মন্তব্য বিদ্যমান আছে কি না।

কোনও সহায়তা অত্যন্ত প্রশংসনীয় হবে।


5
আপনি যদি COUNT এর পরিবর্তে SUM ব্যবহার করেন?
জন পিক

উত্তর:


265

sum()জায়গায় ব্যবহার করুনcount()

নীচে চেষ্টা করুন:

SELECT
    ccc_news . * , 
    SUM(if(ccc_news_comments.id = 'approved', 1, 0)) AS comments
FROM
    ccc_news
    LEFT JOIN
        ccc_news_comments
    ON
        ccc_news_comments.news_id = ccc_news.news_id
WHERE
    `ccc_news`.`category` = 'news_layer2'
    AND `ccc_news`.`status` = 'Active'
GROUP BY
    ccc_news.news_id
ORDER BY
    ccc_news.set_order ASC
LIMIT 20 

11
অথবা মাইএসকিউএল-নির্দিষ্ট কৌশল হিসাবে সুম (সিসি_নিউজ_কমেন্টস আইড = 'অনুমোদিত')
মোজুবা

1
@mojuba% না 100 একই, আপনার কৌতুক আয় nullযখন COUNT(কোন সর্ত) ফিরে করেছি হবে 0। যখন COUNTকিছু ফিরে করেছি হবে কিন্তু 0, কিন্তু SUM আছে আগমন 0, আপনার কৌতুক আয় 0
রবিন ক্যান্টারস

@ মোজুবা মামলা এবং পয়েন্টnum_relevant_partsহয় SUM, অবস্থার সঙ্গে num_total_partsহয় COUNT(parts.id)(ডাবল মন্তব্যের জন্য দুঃখিত, সম্পাদনা করতে খুব দেরি হয়ে গেছে)
রবিন Kanters

68

আরও ভাল (বা যাইহোক ছোট):

SUM(ccc_news_comments.id = 'approved')

মাইএসকিউএল মধ্যে বুলিয়ান টাইপ যেহেতু এই কাজ হিসাবে প্রতিনিধিত্ব করা হয় INT 0এবং 1মাত্র সি মত, (ডিবি সিস্টেম যদিও জুড়ে পোর্টেবল নাও হতে পারে।)

হিসাবে COALESCE()হিসাবে অন্যান্য উত্তর উল্লেখ করা হয়েছে, অনেক ভাষা API গুলি স্বয়ংক্রিয়ভাবে রূপান্তর NULLকরতে ''যখন মান আনার সময়। উদাহরণস্বরূপ পিএইচপি এর mysqliইন্টারফেস সহ এটি আপনার ক্যোয়ারীটি চালানো ছাড়া নিরাপদ হবে COALESCE()


3
এটি উল্লেখযোগ্যভাবে আরও পঠনযোগ্য এসকিউএল কোড তৈরি করে। সুন্দর সমাধান।
ড্যাগ সন্ড্রে হ্যানসেন

22

এই কাজ করা উচিত:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, NULL))

count()কেবল মানটি আছে কি না তা পরীক্ষা করে দেখুন। 0 একটি বিদ্যমান মানের সমতুল্য, সুতরাং এটি আরও একটি হিসাবে গণনা করা হয়, যখন NULL একটি অস্তিত্বমান মানের মতো হয়, সুতরাং এটি গণনা করা হয় না।


আমি মনে করি এই ক্ষেত্রে countতুলনায় আরও স্বজ্ঞাত sum
জেফারি

4

এই লাইনটি প্রতিস্থাপন করুন:

count(if(ccc_news_comments.id = 'approved', ccc_news_comments.id, 0)) AS comments

এটার সাথে:

coalesce(sum(ccc_news_comments.id = 'approved'), 0) comments

গণনা (যদি (সিসি_নিউজ_কমেন্টস.আইডি = 'অনুমোদিত', সিসি_নিউজ_কমেন্টস.আইডি, 0)) ??? আপনি যদি সিসি_নিউজ_কমেন্টস.আইডি ব্যবহার করেন তবে যোগফল ব্যবহারের অর্থ কী হবে

দুঃখিত, আপনার অর্থ কি? বুলিয়ান মান 0 বা 1 হয়ে যায়, তার পরে যোগফল হয়, এবং যদি 0 এর সাথে কিছু নাল মান একত্রিত হয়
মোস্টি মোস্তাচো

@ মোস্টিমোস্টাচো, COALESCEযোগফল কি ফেরত দেবে? মাইএসকিউএল ডকের কোনও রেফারেন্স?
ইসতিয়াক আহমেদ

হ্যাঁ, কেন হবে না? ডক্সে
মোস্তি মোস্তাচো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.