Làm thế nào để thực hiện nhiều số đếm trong một truy vấn?


11

Tôi đếm hồ sơ với các truy vấn như

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%'

Đối với mỗi số đếm, mysql cần phải đi qua bảng và đây là một vấn đề lớn nếu có bảng dài và nhiều truy vấn.

Tôi tự hỏi nếu có một cách để làm cho tất cả các tính trong một truy vấn. Trong trường hợp này, khi mysql đi qua từng hàng, nó sẽ xử lý tất cả các số đếm và không cần phải quét lại toàn bộ bảng nhiều lần.


Để thêm vào các câu trả lời đúng, các truy vấn được đề xuất chỉ quét bảng một lần.

Câu trả lời:


20

Để có được số lượng cho mỗi người bạn có thể thử

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

Tương tự như solutio của Aaron, cú pháp ngắn hơn:

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

Biểu thức THÍCH làm cho một kết quả boolean. TRUE1 , FALSE0 , vì vậy CASElà dư thừa ở đây.


Rất gọn gàng và súc tích - nhưng điều gì xảy ra khi số lượng không phù hợp với TINYINT - bạn có gặp lỗi hoặc một số loại chuyển đổi loại xảy ra không?
Jack nói hãy thử topanswers.xyz

Không có TINYINTtrong câu chuyện này. SUMlấy bất kỳ loại số nào (thậm chí là float) và tạo ra kết quả số. Bạn có thể SUMcác cột TINYINTloại để nhận giá trị trong hàng nghìn - đó không phải là vấn đề.
Shlomi Noach

Tất nhiên bạn biết rằng bool đồng nghĩa với tinyt btw?
Jack nói hãy thử topanswers.xyz

Vâng, bạn của tôi, tôi biết điều đó. "Không có TINYINTtrong câu chuyện này" có lẽ không phải là một câu hay để bắt đầu.
Shlomi Noach

1
Một lưu ý cho bất kỳ ai vấp ngã ở đây khi tìm kiếm câu trả lời cụ thể cho MS SQL Server, SUMchức năng như được đề cập ở đây không hoạt động theo cách tương tự trong MS SQL Server. Trong Transct-SQL chỉ SUMcó thể được sử dụng với các cột số.
dùng1451111

-1

Nếu tôi nhận được nhu cầu của bạn, điều này có lẽ sẽ thực hiện được mẹo:

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

1
Nhìn vào Aarons anwser có lẽ là những gì bạn đang theo đuổi - để có được nhiều số đếm - không phải là tổng của tất cả các số đếm.
JohnP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.