하나의 쿼리에서 여러 카운트를 만드는 방법은 무엇입니까?


12

다음과 같은 쿼리로 레코드를 계산합니다.

SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%something%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%another%'
SELECT COUNT(col1) FROM table1 WHERE col1 LIKE '%word%'

각 수에 대해 mysql은 테이블을 벗어나야하며 테이블이 길고 많은 쿼리가있는 경우 큰 문제입니다.

하나의 쿼리로 모든 계산을 수행 할 수있는 방법이 있는지 궁금합니다. 이 경우 mysql이 각 행을 넘을 때 모든 카운트를 처리하므로 전체 테이블을 반복해서 스캔 할 필요가 없습니다.


올바른 답변에 추가하기 위해 제안 된 쿼리는 테이블을 한 번만 스캔합니다.

답변:


21

당신이 시도 할 수있는 각 사람의 수를 얻으려면

SELECT
    COUNT(CASE WHEN `col1` LIKE '%something%' THEN 1 END) AS count1,
    COUNT(CASE WHEN `col1` LIKE '%another%' THEN 1 END) AS count2,
    COUNT(CASE WHEN `col1` LIKE '%word%' THEN 1 END) AS count3
FROM `table1`; 

16

Aaron의 solutio와 유사하고 더 짧은 구문 :

SELECT
    SUM(col1 LIKE '%something%') AS count1,
    SUM(col1 LIKE '%another%') AS count2,
    SUM(col1 LIKE '%word%') AS count3
FROM `table1`

LIKE 표현식은 부울 결과를 만듭니다. TRUE이다 1 , FALSE이다 (가) 때문에, CASE중복 여기에있다.


매우 깔끔하고 간결합니다. 그러나 카운트가 TINYINT에 맞지 않으면 어떻게됩니까? 오류가 발생하거나 일종의 유형 변환이 발생합니까?
잭 topanswers.xyz 시도라고

TINYINT이 이야기 에는 없습니다 . SUM어떤 유형의 숫자이든 (float조차도) 숫자 결과를 생성합니다. 수천 개의 값을 얻기 위해 유형의 SUM열을 사용할 수 있습니다 TINYINT. 문제는 아닙니다.
Shlomi Noach

물론 bool이 tinyint btw와 동의어라는 것을 알고 있습니까?
잭 topanswers.xyz 시도라고

예, 친구, 알고 있습니다. " TINYINT이 이야기 에는 없다 "는 아마도 좋은 문장이 아닐 수도 있습니다.
Shlomi Noach

1
MS SQL Server 특정 답변을 찾기 위해 여기에서 우연히 만난 사람에게 여기에 SUM언급 된 기능은 MS SQL Server에서 동일한 방식으로 작동하지 않습니다. Transct-SQL에서는 SUM숫자 열에 만 사용할 수 있습니다.
user1451111

-1

내가 당신의 필요를 올바르게 얻으면 아마도 이것이 트릭을 할 것입니다 :

SELECT SUM(CASE 
  WHEN col1 LIKE '%something' THEN 1 
  WHEN col1 LIKE '%another%' THEN 1 
END) AS result
FROM table1;

1
모든 카운트의 합계가 아니라 여러 카운트를 얻기 위해 아마도 당신이 따르는 것 인 Aarons anwser를 살펴보십시오.
JohnP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.