लारवेल एलोकेंट - अलग () और गिनती () एक साथ ठीक से काम नहीं कर रहा है


95

इसलिए मैं एक क्वेरी पर अलग-अलग pids की संख्या प्राप्त करने की कोशिश कर रहा हूं, लेकिन लौटाया गया मान गलत है।

यह वही है जो मैं करने की कोशिश करता हूं:

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

क्या मान "2" लौटाता है, जबकि मूल्य इसे वापस आना चाहिए, "1" होना चाहिए।

वर्कअराउंड के रूप में, मैं यह कर रहा हूँ:

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

क्या ठीक काम करता है और "1" देता है

क्या कोई नियम है जहाँ गिनती और विशिष्ट समान क्वेरी पर नहीं हो सकते हैं? मुझे "भारी" का वर्कअराउंड मिल गया है, मैं मूल क्वेरी काम करना चाहूँगा :(


डेटाबेस में आपकी नमूना तालिका में आपके पास क्या है? और आप क्या हासिल करना चाहते हैं? अब आपको संभवतः pidकॉलम में अलग-अलग मानों की संख्या मिलनी चाहिए , इसलिए यदि आपके टेबल 2 रिकॉर्ड्स में हैं - एक पीआईडी ​​1 के साथ, दूसरा पीआईडी ​​2 के साथ, गिनती 2. वापस आनी चाहिए
Marcin Nabiałek

आप बस इस तरह से गिनती के साथ मिल की जगह ले सकता: $count = DB::table('tablename')->count(DB::raw('DISTINCT pid')); : भी कर सकते हैं DB::table('tablename')->distinct('pid')->count('pid');
भारत

जवाबों:


123

निम्नलिखित काम करना चाहिए

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

2
एक समान मुद्दा था और यह सिर्फ 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बाद में आवेदन कर सकते हैं , यदि आपको पंक्तियों के लिए इसकी आवश्यकता है।


$ बिल्डर कहां से आया?
एंड्रयू

1
@ और Laravel क्वेरी बिल्डर का उपयोग आप क्वेरी के लिए कर रहे हैं। उदाहरण के लिए, एक स्पष्ट वस्तु$books = Book::where(...)->count(...)
Zoon

->count(DB::raw('DISTINCT b'))उसी के रूप में SQL क्वेरी उत्पन्न->distinct()->count('b')
ट्रेवर Gehman

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();

चर्चा के लिए यहां देखें ..


3
यह एक अच्छा समाधान नहीं है, क्योंकि get()कॉल क्वेरी को निष्पादित करेगा और डेटाबेस से परिणाम लौटाएगा, और फिर count()संग्रह पर रन करेगा।
ट्रेवर गेहमान

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

समूह को वैकल्पिक रूप से याद रखें, यह ज्यादातर मामलों में काम करना चाहिए जब आप डुप्लिकेट किए गए चुनिंदा मानों को बाहर करने के लिए एक गिनती समूह चाहते हैं, तो addSelect एक क्वेरी बिल्डर उदाहरण विधि है।


0

डिस्टि्रक्ट तर्क न लें क्योंकि यह आपकी sql क्वेरी में 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
]

-1

यह मेरे लिए काम कर रहा था इसलिए यह कोशिश करें: $ ad-> getcodes () -> अलग ('pid') -> count ()


एसओ का स्वागत है। किसी प्रश्न का उत्तर देते समय कृपया आपके द्वारा आपूर्ति किए गए कोड पर अतिरिक्त जानकारी प्रदान करें। इस तरह के योगदान का स्वागत है, लेकिन भविष्य में दूसरों को एक शॉट स्पष्टीकरण से लाभ हो सकता है
निर्भरता

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.