Laravel Eloquent - farklı () ve count () birlikte düzgün çalışmıyor


103

Bu yüzden, bir sorguda farklı pid sayısını almaya çalışıyorum, ancak döndürülen değer yanlış.

Yapmaya çalıştığım şey bu:

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

"2" değerini döndüren, dönmesi gereken değer ise "1" olmalıdır.

Çözüm olarak şunu yapıyorum:

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

iyi çalışan ve "1" döndüren

Sayım ve farklılığın aynı sorguda olamayacağı herhangi bir kural var mı? Geçici çözüm türünü "ağır" buluyorum, orijinal sorguyu çalıştırmak istiyorum :(


Veritabanındaki örnek tablonuzda ne var? Ve ne elde etmek istiyorsun? Şimdi muhtemelen pidsütunda farklı değerlerin sayısını almalısınız , bu nedenle tablo 2 kayıtlarınız varsa - biri pid 1, ikincisi pid 2, count 2 döndürmelidir.
Marcin Nabiałek

$count = DB::table('tablename')->count(DB::raw('DISTINCT pid'));DB::table('tablename')->distinct('pid')->count('pid');
get'i

Yanıtlar:


132

Aşağıdakiler çalışmalı

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

2
Benzer bir sorun vardı ve öyle görünüyor groupByki, hile yapmaz.
jeteon

8
Distinct herhangi bir argüman almaz. Sorgunuzu oluştururken farklı () çağrısı yalnızca korumalı boole değerini true olarak ayarlar, bağımsız değişken yok sayılır.
Matt McDonald

L5.1'de ve bu hala çalışmıyor. Kullanma count()devre dışı bırakmak veya damla gibi görünüyor distinct(). groupBy()Soru boyunca açıklandığı gibi kullanın . Düzenleme: Ben bile buluyorum groupBy()farklı sağlamaktadır count()kıyasla get()çıkan dizi sayarak izledi.
Jason

@Jason ben de seninle aynı gözlemi yaptım. Çözüm için cevabımı görün.
Zoon

21
distinct()Fonksiyon argümansızdır. Sen olarak değiştirebilirsiniz $ad->getcodes()->distinct()->count('pid');aynı sonucu.
Trevor Gehman

28

Bana ve umarım başkalarına zaman kazandıracak daha genel bir yanıt:

Çalışmıyor (tüm satırların sayısını döndürür):

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

Çözüm:

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

17

Bu gönderiye rastlayan ve çalışmak için diğer önerileri bulamayan başka kimse var mı?

Spesifik sorguya bağlı olarak, farklı bir yaklaşım gerekebilir. Benim durumumda, ya a'nın sonuçlarını saymam gerekiyordu GROUP BY, örn.

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

veya şunu kullanın COUNT(DISTINCT b):

SELECT COUNT(DISTINCT b) FROM a

Biraz kafa karıştırdıktan sonra, bunlardan herhangi biri için yerleşik Laravel işlevi olmadığını fark ettim. Bu yüzden en basit çözüm yöntemle DB::rawbirlikte kullanmaktı count.

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

Unutmayın, groupByaramadan önce kullanmayın count. groupBySatır almak için ihtiyacınız olursa daha sonra başvurabilirsiniz .


$ Builder nereden geldi?
Andrew

1
@Andrew Sorgu için kullandığınız Laravel sorgu oluşturucu. Örneğin, bir Eloquent nesnesi$books = Book::where(...)->count(...)
Zoon

->count(DB::raw('DISTINCT b'))ile aynı SQL sorgusunu ->distinct()->count('b')
oluştur

5

Benzer bir sorun yaşadım ve bu sorunu çözmenin bir yolunu buldum.

Sorun, Laravel'in sorgu oluşturucusunun toplamaları işleme biçimidir. Döndürülen ilk sonucu alır ve ardından 'toplam' değeri döndürür. Bu genellikle iyidir, ancak sayımı groupBy ile birleştirdiğinizde, gruplanan öğe başına bir sayım döndürüyorsunuz. Dolayısıyla, ilk satırın toplamı yalnızca ilk grubun bir sayısıdır (yani 1 veya 2 gibi düşük bir değer olması muhtemeldir).

Yani Laravel'in sayımı bitti, ancak Laravel sorgu oluşturucuyu bazı ham SQL ile birleştirerek gruplanmış sonuçlarımın doğru bir sayısını elde ettim.

Örneğiniz için, aşağıdakilerin işe yaramasını bekliyorum (ve almaktan kaçınmanıza izin verin):

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

Tüm sütunları seçerek zaman kaybetmediğinizden emin olmak istiyorsanız, sorgunuzu oluştururken bundan kaçınabilirsiniz:

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

4

Ben de aynı problemle karşılaştım.

Laravel hata ayıklama çubuğunu kurarsanız, sorguları görebilir ve genellikle sorunu görebilirsiniz.

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

değişmek

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

Farklı olarak dönmek için değerleri ayarlamanız gerekir. Seçme alanlarını ayarlamazsanız, veritabanındaki tüm sütunları döndürür ve tümü benzersiz olur. Bu nedenle, sorguyu farklı olarak ayarlayın ve yalnızca daha fazlasını eklemek isteyebileceğiniz 'farklı' değerinizi oluşturan sütunları seçin. ->select('pid','date')bir kullanıcı için tüm benzersiz değerleri bir günde almak


4

İhtiyacınıza göre benzersiz verileri elde etmek için aşağıdaki yolu kullanabilirsiniz:

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

$count = $data->count();

Umarım bu işe yarar.


1

Bu işe yaramaz mı?

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

Tartışma için buraya bakın ..


3
Bu iyi bir çözüm değildir, çünkü get()çağrı sorguyu yürütür ve sonuçları veritabanından ve ardından count()Koleksiyondaki çalıştırmaları döndürür .
Trevor Gehman

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

Gruplama ölçütü seçeneğinin isteğe bağlı olduğunu unutmayın; bu, çoğu durumda, yinelenen seçme değerleri hariç tutmak için bir sayım grubu istediğinizde çalışmalıdır; addSelect bir sorgu oluşturucu örnek yöntemidir.


0

Sql sorgunuza DISTINCT eklediği için farklı argümanlar almayın, bununla birlikte, farklı olarak seçmek istediğiniz sütun adını tanımlamanız gerekebilir. Böylece, varsa Flight->select('project_id')->distinct()->get()için equialent olduğunu SELECT DISTINCT 'project_id' FROM flightsve artık sayımı () veya hatta çiğ anlamlı sorgular gibi diğer değiştiriciler ekleyebilir.


0

Ham sorgular için Laravel belgelerine dayanarak , ürün modelinde bu kodla çalışmak için seçilen bir alanın sayısını elde edebildim.

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

Bu cephe, kontrolörde aynı sonucu almak için çalıştı:

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

Her iki sorgu için ortaya çıkan döküm aşağıdaki gibiydi:

#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

Bu benim için çalışıyordu, bu yüzden Şunu Deneyin: $ ad-> getcodes () -> farklı ('pid') -> count ()


Merhaba SO'ya hoş geldiniz. Bir soruyu yanıtlarken lütfen sağladığınız kodla ilgili ek bilgi sağlayın. Bunun gibi katkılar memnuniyetle karşılanır, ancak diğerleri gelecekte bir çekim açıklamasından yararlanabilir
Deepend

-3

bunu dene

$ad->getcodes()->groupby('pid')->distinct()->count('pid')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.