2014-01-20 3 views
4

일부 콘텐츠를 즐겨 찾기로 표시 한 사용자의 수를 선택하고 현재 사용자가 "투표"했는지 여부도 반환합니다. 내 표는 내가 has_voted=0를 얻을이SELECT CASE, COUNT (*)

SELECT COUNT(*), CASE 
     WHEN user='22' 
      THEN 1 
      ELSE 0 
    END as has_voted 
FROM favorites WHERE content = '26977' 
내가 has_voted=1을 얻을 것으로 기대

COUNT(*)=3하지만

를 사용

INSERT INTO `favorites` (`user`, `content`) VALUES 
(11, 26977), 
(22, 26977), 
(33, 26977); 

를 포함하는 3 개 행이이

CREATE TABLE IF NOT EXISTS `favorites` (
`user` int(11) NOT NULL DEFAULT '0', 
`content` int(11) NOT NULL DEFAULT '0', 
PRIMARY KEY (`user`,`content`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ; 

말처럼 보인다 COUNT(*)=3. 왜 그런가요? 그것을 고치는 방법?

답변

6

집합체 및 집합되지 않은 표현식을 하나의 SELECT에 혼합했기 때문입니다. 집계 된 표현식은 많은 행에서 작동합니다. 집계되지 않은 표현식은 단일 행에서 작동합니다. 귀하의 상황에 맞지 않는 GROUP BY이있을 경우 집계 된 (즉, COUNT(*)) 표현식과 집계되지 않은 표현식 (즉, CASE)이 같은 SELECT에 나타나야합니다.

당신은 두 번째 식을 집계하여 쿼리를 해결할 수 있습니다 - 즉 다음과 같이 주위에 SUM를 추가 :

SELECT 
    COUNT(*) AS FavoriteCount 
, SUM(CASE WHEN user=22 THEN 1 ELSE 0 END) as has_voted 
FROM favorites 
WHERE content = 26977 

지금 두 표현식이 집계되어, 당신이 예상 결과를 얻을 수 있어야하므로.

1

투표 합계가 필요합니다.

SELECT COUNT(*), SUM(CASE 
     WHEN user='22' 
      THEN 1 
      ELSE 0 
    END) as has_voted 
FROM favorites WHERE content = '26977' 
2

이 시도 :

SELECT COUNT(*), MAX(USER=22) AS has_voted 
FROM favorites 
WHERE content = 26977; 

확인 SQL FIDDLE DEMO

OUTPUT

| COUNT(*) | HAS_VOTED | 
|----------|-----------| 
|  3 |   1 | 
+0

이 부울 표현식 결과를 검색하기 위해 MySQL의 기능을 사용의 좋은 예입니다 여기에 당신이해야 할 것입니다. 주어진 문제에 대한 아주 좋은 해결책. 당신의 대답은 훌륭했을 것입니다, 당신은 일하는 해결책을 주었을뿐만 아니라, daker의 실수를 설명했습니다. 내 의견이지만, 최선의 해결책은 내 투표. –

+0

@ThorstenKettner 당신이 가장 환영합니다 ... –

5

SUM()에 이것을 시도하지 않고 CASE

당신은 일치의 수 (집계 함수 COUNT)를 보여주는 하나의 결과 만 기록을 얻을 수 있도록 결과를 집계 :
SELECT 
    COUNT(*), 
    SUM(USER = '22') AS has_voted 
FROM 
    favorites 
WHERE content = '26977' 

See Fiddle Demo

1

당신은 실수로 여기에 MySQL의 기능을 사용하는. 그러나 사용자 (또는 집계 함수없이) 결과 행에 사용자 (또는 그 위에 작성된 표현식)를 표시 할 수도 있습니다. 그래서 질문은 : 어떤 사용자입니까? 또 다른 dbms는 GROUP BY에서 사용자를 설명하거나 사용자를 집계하도록 요청하면서 오류가 발생했습니다. 대신 MySQL은 무작위 사용자를 선택합니다.

여기에서 수행하려는 것은 집계 사용자 (또는 표현식을 집계 한 것)입니다. 사용자가 요청한 내용에 주신 모든 투표 합계를 SUM을 사용

SELECT 
    COUNT(*), 
    SUM(CASE WHEN user='22' THEN 1 ELSE 0 END) as sum_votes 
FROM favorites 
WHERE content = '26977'; 
1

당신은 집계 함수 내부의 CASE 문을 래핑하는 잊어 버렸습니다. 이 경우 has_voted에는 실제로 "부분 그룹화"를 수행하기 때문에 예기치 않은 결과가 포함됩니다.

SELECT COUNT(*), SUM(CASE WHEN USER = 22 THEN 1 ELSE 0 END) AS has_voted 
FROM favorites 
WHERE content = 26977 

또는 :

SELECT COUNT(*), COUNT(CASE WHEN USER = 22 THEN 1 ELSE NULL END) AS has_voted 
FROM favorites 
WHERE content = 26977