লারাভেল স্পষ্টত - স্বতন্ত্র () এবং গণনা () একসাথে সঠিকভাবে কাজ করছে না


99

সুতরাং আমি একটি ক্যোয়ারিতে পৃথক পিডের সংখ্যা পাওয়ার চেষ্টা করছি তবে প্রত্যাবর্তিত মানটি ভুল।

এটিই আমি করার চেষ্টা করি:

$ad->getcodes()->groupby('pid')->distinct()->count()

"2" মানটি কী দেয়, যখন এটির মানটি ফিরে আসে, "1" হওয়া উচিত।

কার্যতঃ হিসাবে, আমি এটি করছি:

count($ad->getcodes()->groupby('pid')->distinct()->get())

কি ভাল কাজ করে এবং "1" ফেরত দেয়

এখানে কোনও নিয়ম আছে যেখানে গণনা এবং স্বতন্ত্র একই প্রশ্নে থাকতে পারে না? আমি কাজের ভারসাম্যপূর্ণ ধরণের "ভারী" পেয়েছি, আমি মূল জিজ্ঞাসাটি তৈরি করতে চাই :(


ডাটাবেসে আপনার নমুনা টেবিলটিতে আপনার কী আছে? এবং আপনি কি অর্জন করতে চান? এখন আপনি সম্ভবত স্বতন্ত্র মান রয়েছে তা গণনা পাওয়া উচিত pidকলাম, তাই যদি আপনি আপনার টেবিল 2 রেকর্ডে আছে - দ্বিতীয় PID 2, PID 1 এক, গণনা ফেরত পাঠাবেন 2.
মার্সিন Nabiałek

আপনি কেবল এইভাবে গণনার সাথে প্রতিস্থাপন করতে পারেন: $count = DB::table('tablename')->count(DB::raw('DISTINCT pid')); এছাড়াও করতে পারেন: DB::table('tablename')->distinct('pid')->count('pid');
ভারত

উত্তর:


128

নিম্নলিখিত কাজ করা উচিত

$ad->getcodes()->distinct('pid')->count('pid');

4
একটি অনুরূপ সমস্যা ছিল এবং এটি মনে হচ্ছে ঠিক groupByকৌশলটি বাদ দিচ্ছে ।
জেটিয়ন

8
আলাদা কোনও আর্গুমেন্ট নেয় না। আপনার ক্যোয়ারী তৈরি করার সময় স্বতন্ত্র () কল করা কেবল সুরক্ষিত বুলেটিয়ানকে সত্য হিসাবে সেট করে, যুক্তি উপেক্ষা করা হয়।
ম্যাট ম্যাকডোনাল্ড

L5.1 এ এবং এটি এখনও কাজ করছে না। ব্যবহারটি count()অক্ষম বা ড্রপ বলে মনে হচ্ছে distinct()groupBy()প্রশ্ন জুড়ে বর্ণিত হিসাবে ব্যবহার করুন । সম্পাদনা করুন: ফলাফলগুলি অ্যারে গণনা করে তার তুলনায় আমি এমনকি সন্ধান করছি groupBy()যা অন্যরকম সরবরাহ করছে । count()get()
জেসন

@ জেসন আমি আপনার মত একই পর্যবেক্ষণ করেছি। একটি সমাধানের জন্য আমার উত্তর দেখুন।
জুন

21
distinct()ফাংশন কোন যুক্তি লাগে। আপনি $ad->getcodes()->distinct()->count('pid');একই ফলাফলের সাথে এটিতে পরিবর্তন করতে পারেন ।
ট্রেভর গেহম্যান

26

আরও সাধারণ জবাব যা আমার সময় বাঁচাতে পারত এবং আশা করি অন্যরা:

কাজ করে না (সমস্ত সারি গণনা প্রদান করে):

DB::table('users')
            ->select('first_name')
            ->distinct()
            ->count();

ঠিক করা:

DB::table('users')
            ->distinct()
            ->count('first_name');

17

এই পোস্টটি জুড়ে অন্য কেউ আসে, এবং কাজ করার জন্য অন্যান্য পরামর্শ খুঁজে পাচ্ছেন না?

নির্দিষ্ট প্রশ্নের উপর নির্ভর করে, একটি পৃথক পদ্ধতির প্রয়োজন হতে পারে। আমার ক্ষেত্রে, আমার হয় হয় ফলাফল ফলাফল গণনা GROUP BY, যেমন

SELECT COUNT(*) FROM (SELECT * FROM a GROUP BY b)

বা ব্যবহার করুন COUNT(DISTINCT b):

SELECT COUNT(DISTINCT b) FROM a

কিছুটা অবাক হয়ে যাওয়ার পরে, আমি বুঝতে পারি যে এগুলির কোনওটির জন্য কোনও বিল্ট-ইন লারাভেল ফাংশন নেই। সুতরাং সহজ সমাধানটি ছিল পদ্ধতিটির DB::rawসাথে ব্যবহার করা count

$count = $builder->count(DB::raw('DISTINCT b'));

মনে রাখবেন, groupByকল করার আগে ব্যবহার করবেন না count। আপনার groupByযদি সারি পাওয়ার জন্য প্রয়োজন হয় তবে আপনি পরে আবেদন করতে পারেন ।


$ নির্মাতা কোথা থেকে এসেছিলেন?
অ্যান্ড্রু

4
@ অ্যান্ড্রু ল্যারাভেল কোয়েরি বিল্ডার আপনি ক্যোয়ারির জন্য ব্যবহার করছেন। উদাহরণস্বরূপ, একটি সুস্পষ্ট অবজেক্ট$books = Book::where(...)->count(...)
জুন জুন

->count(DB::raw('DISTINCT b'))একই এসকিউএল কোয়েরি তৈরি করুন->distinct()->count('b')
ট্রেভর গেহম্যান

5

আমারও একই সমস্যা ছিল এবং এর চারপাশে কাজ করার একটি উপায় খুঁজে পেয়েছি।

সমস্যাটি হ'ল লারাভেলের ক্যোয়ারী নির্মাতা সমষ্টি পরিচালনা করে। এটি প্রথম ফলাফলটি গ্রহণ করে এবং তারপরে 'সমষ্টিগত' মান দেয়। এটি সাধারণত সূক্ষ্ম হয়, তবে আপনি যখন গ্রুপের সাথে গণনাটি একত্রিত করেন আপনি দলবদ্ধ আইটেমের জন্য একটি গণনা ফিরিয়ে দেন। সুতরাং প্রথম সারির সমষ্টি প্রথম গ্রুপের একটি গণনা (সুতরাং 1 বা 2 এর মতো কিছু কম হওয়ার সম্ভাবনা রয়েছে)।

সুতরাং লারাভেলের গণনাটি বাইরে, তবে আমি লারাভেল কোয়েরি বিল্ডারকে কিছু কাঁচা এসকিউএল এর সাথে সংযুক্ত করে আমার গোষ্ঠীভিত্তিক ফলাফলের সঠিক গণনা পেতে পারি।

আপনার উদাহরণস্বরূপ, আমি আশা করি নিম্নলিখিতটি কাজ করা উচিত (এবং আপনাকে এড়াতে দিন):

$query = $ad->getcodes()->groupby('pid')->distinct();
$count = count(\DB::select($query->toSql(), $query->getBindings()));

আপনি যদি নিশ্চিত করতে চান যে আপনি সমস্ত কলামগুলি নির্বাচন করে সময় নষ্ট করছেন না, আপনার ক্যোয়ারীটি তৈরি করার সময় আপনি তা এড়াতে পারেন:

 $query = $ad->select(DB::raw(1))->getcodes()->groupby('pid')->distinct();

4

আমি একই সমস্যা জুড়ে এসেছি।

যদি আপনি লারাভেল ডিবাগ বারটি ইনস্টল করেন আপনি কোয়েরিগুলি দেখতে এবং প্রায়শই সমস্যাটি দেখতে পারেন

$ad->getcodes()->groupby('pid')->distinct()->count()

পরিবর্তন

$ad->getcodes()->distinct()->select('pid')->count()

স্বতন্ত্র হিসাবে ফিরে আসতে আপনাকে মানগুলি সেট করতে হবে। আপনি যদি নির্বাচিত ক্ষেত্রগুলি সেট না করেন এটি ডাটাবেসে সমস্ত কলাম ফিরিয়ে দেবে এবং সমস্ত অনন্য হবে। সুতরাং ক্যোয়ারিকে আলাদা করে সেট করুন এবং কেবলমাত্র কলামগুলি নির্বাচন করুন যা আপনার 'স্বতন্ত্র' মানটি তৈরি করতে পারে যা আপনি আরও যুক্ত করতে চান। ->select('pid','date')এক দিনের মধ্যে ব্যবহারকারীর জন্য সমস্ত অনন্য মান পেতে


4

আপনার প্রয়োজন অনুযায়ী অনন্য ডেটা পেতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন,

$data = $ad->getcodes()->get()->unique('email');

$count = $data->count();

আশা করি এটি কার্যকর হবে।


1

এই কাজ করবে না?

$ad->getcodes()->distinct()->get(['pid'])->count();

আলোচনার জন্য এখানে দেখুন ..


4
এটি কোনও ভাল সমাধান নয়, কারণ get()কলটি কোয়েরিটি কার্যকর করবে এবং ডাটাবেস থেকে ফলাফলগুলি ফিরিয়ে দেবে, এবং তারপরে count()সংগ্রহের দিকে রান করবে।
ট্রেভর গেহম্যান

1
$solution = $query->distinct()
            ->groupBy
            (
                [
                    'array',
                    'of',
                    'columns',
                ]
            )
            ->addSelect(
                [
                    'columns',
                    'from',
                    'the',
                    'groupby',
                ]
            )
            ->get();

মনে রাখবেন যে গোষ্ঠীটিটি isচ্ছিক, এটি বেশিরভাগ ক্ষেত্রে কাজ করা উচিত যখন আপনি সদৃশ নির্বাচিত মানগুলি বাদ দিয়ে কোনও গণনা গোষ্ঠী চান, অ্যাডসलेक्ट একটি কোয়েরি বিল্ডার উদাহরণ পদ্ধতি।


0

আপনার বর্গ কোয়েরিতে DISTINCT যুক্ত করার সাথে আলাদাভাবে আর্গুমেন্টগুলি গ্রহণ করবেন না, তবে আপনাকে কলামের নামটি সংজ্ঞায়িত করতে হবে যা আপনি আলাদা করতে চান। সুতরাং, যদি আপনার Flight->select('project_id')->distinct()->get()সাথে সামঞ্জস্য হয় SELECT DISTINCT 'project_id' FROM flightsএবং আপনি এখন অন্যান্য সংশোধক যেমন গণনা () বা এমনকি কাঁচা বুদ্ধিমান কোয়েরি যুক্ত করতে পারেন।


0

কাঁচা প্রশ্নের জন্য লারাভেল ডক্সের ভিত্তিতে আমি পণ্যের মডেলটিতে এই কোডটির সাথে কাজ করার জন্য একটি নির্বাচিত ক্ষেত্রের জন্য গণনা করতে সক্ষম হয়েছি।

public function scopeShowProductCount($query)
{
    $query->select(DB::raw('DISTINCT pid, COUNT(*) AS count_pid'))
          ->groupBy('pid')
          ->orderBy('count_pid', 'desc');
}

এই সম্মুখভাগটি নিয়ামক হিসাবে একই ফলাফল পেতে কাজ করেছে:

$products = DB::table('products')->select(DB::raw('DISTINCT pid, COUNT(*) AS count_pid'))->groupBy('pid')->orderBy('count_pid', 'desc')->get();

উভয় প্রশ্নের জন্য ফলাফল ডাম্প নিম্নলিখিত ছিল:

#attributes: array:2 [
  "pid" => "1271"
  "count_pid" => 19
],
#attributes: array:2 [
  "pid" => "1273"
  "count_pid" => 12
],
#attributes: array:2 [
  "pid" => "1275"
  "count_pid" => 7
]

-2

এটি আমার জন্য কাজ করছিল তাই এটি ব্যবহার করে দেখুন: $ বিজ্ঞাপন-> গেটকোডস () -> স্বতন্ত্র ('পিড') -> গণনা ()


হাই তাই আপনাকে স্বাগতম। কোনও প্রশ্নের উত্তর দেওয়ার সময় দয়া করে আপনার সরবরাহ করা কোডটিতে অতিরিক্ত তথ্য সরবরাহ করুন। এর মতো অবদানগুলি স্বাগত তবে ভবিষ্যতে অন্যরা শট ব্যাখ্যা দ্বারা উপকৃত হতে পারে
ডিপেন্ডেড

-3

এটা চেষ্টা কর

$ad->getcodes()->groupby('pid')->distinct()->count('pid')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.