Laravel Eloquent-distinct () 및 count ()가 함께 제대로 작동하지 않음


99

그래서 쿼리에서 고유 한 pid의 수를 가져 오려고하는데 반환 된 값이 잘못되었습니다.

이것이 내가하려는 것입니다.

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

값 "2"를 리턴하는 것은 리턴해야하는 값이 "1"이어야합니다.

해결 방법으로 다음을 수행합니다.

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

잘 작동하고 "1"을 반환하는 것

개수와 구별이 동일한 쿼리에있을 수없는 규칙이 있습니까? "무거움"의 해결 방법을 찾았습니다. 원래 쿼리가 작동하도록 만들고 싶습니다.


데이터베이스의 샘플 테이블에 무엇을 가지고 있습니까? 그리고 무엇을 성취하고 싶습니까? 이제 pid열에 고유 한 값의 수를
가져와야

다음과 같이 간단히 get을 count로 바꿀 수 $count = DB::table('tablename')->count(DB::raw('DISTINCT pid')); 있습니다 . 또한 다음을 수행 할 수 있습니다. DB::table('tablename')->distinct('pid')->count('pid');
bharat

답변:


128

다음이 작동합니다.

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

2
비슷한 문제가 있었고 groupBy트릭을 생략하는 것 같습니다 .
jeteon 2015 년

8
Distinct는 어떤 주장도 취하지 않습니다. 쿼리를 작성할 때 distinct ()를 호출하면 protected boolean이 true로 설정되고 인수는 무시됩니다.
Matt McDonald

L5.1에서는 여전히 작동하지 않습니다. 을 사용 count()하면 distinct(). groupBy()질문 전체에 설명 된대로 사용하십시오 . 편집 : 결과 배열을 계산 groupBy()하는 것과 count()비교하여 다른 것을 제공하고 get()있습니다.
제이슨

@Jason 당신과 같은 관찰을했습니다. 해결책은 내 대답을 참조하십시오.
Zoon

21
distinct()함수는 인수를 사용하지 않습니다. $ad->getcodes()->distinct()->count('pid');동일한 결과 로 로 변경할 수 있습니다 .
Trevor Gehman 2017

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

약간의 수수께끼 끝에 나는 이들 중 하나에 내장 된 Laravel 함수가 없다는 것을 깨달았습니다. 따라서 가장 간단한 해결책은 방법을 사용하는 것 DB::raw입니다 count.

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

groupBy전화하기 전에 사용하지 마십시오 count. groupBy행을 가져 오는 데 필요한 경우 나중에 신청할 수 있습니다 .


$ builder는 어디에서 왔습니까?
Andrew

1
@Andrew 쿼리에 사용중인 Laravel 쿼리 빌더입니다. 예를 들어, Eloquent 객체$books = Book::where(...)->count(...)
Zoon

->count(DB::raw('DISTINCT b'))다음과 동일한 SQL 쿼리를 생성합니다.->distinct()->count('b')
Trevor Gehman

5

비슷한 문제가 있었고 해결 방법을 찾았습니다.

문제는 Laravel의 쿼리 빌더가 집계를 처리하는 방식입니다. 반환 된 첫 번째 결과를받은 다음 '집계'값을 반환합니다. 일반적으로 괜찮지 만 count를 groupBy와 결합하면 그룹화 된 항목 당 개수를 반환합니다. 따라서 첫 번째 행의 집계는 첫 번째 그룹의 개수 일뿐입니다 (따라서 1 또는 2와 같이 낮은 값일 가능성이 높습니다).

그래서 Laravel의 개수는 나오지 않았지만 Laravel 쿼리 빌더를 원시 SQL과 결합하여 그룹화 된 결과의 정확한 개수를 얻었습니다.

귀하의 예를 들어, 다음이 작동 할 것으로 예상합니다 (그리고 얻을 수 없도록).

$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

나는 같은 문제를 만났다.

laravel 디버그 바를 설치하면 쿼리를 볼 수 있고 종종 문제를 볼 수 있습니다.

$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()컬렉션 에서 실행 되기 때문에 이것은 좋은 솔루션이 아닙니다 .
Trevor Gehman 2017

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

group by는 선택 사항입니다. 이는 count group by가 중복 된 선택 값을 제외하도록하려는 경우 대부분의 경우에 작동합니다. addSelect는 querybuilder 인스턴스 메서드입니다.


0

Distinct는 SQL 쿼리에 DISTINCT를 추가하므로 인수를 사용하지 않지만 구별 할 열 이름을 정의해야 할 수 있습니다. 따라서 Flight->select('project_id')->distinct()->get()가 동등하고 SELECT DISTINCT 'project_id' FROM flights이제 count () 또는 원시 웅변 쿼리와 같은 다른 수정자를 추가 할 수 있습니다.


0

원시 쿼리 에 대한 Laravel 문서를 기반으로 제품 모델에서이 코드로 작업 할 선택 필드의 개수를 얻을 수있었습니다.

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

이것은 나를 위해 일하고 있었으므로 이것을 시도하십시오 : $ ad-> getcodes ()-> distinct ( 'pid')-> count ()


안녕하세요 SO에 오신 것을 환영합니다. 질문에 답할 때 제공 한 코드에 대한 추가 정보를 제공하십시오. 이와 같은 기여는 환영하지만 미래의 다른 사람들은 샷 설명으로부터 혜택을받을 수 있습니다
Deepend

좋은 답변이 아닙니다
Amir karim

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.