วิธีการนับหลายครั้งในหนึ่งแบบสอบถาม?


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

แอพที่คล้ายกับแอรอนของโซลูติโอ, ไวยากรณ์สั้นกว่า:

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คือ0 , ดังนั้นCASEซ้ำซ้อนที่นี่


เรียบร้อยและรัดกุมมาก - แต่จะเกิดอะไรขึ้นเมื่อจำนวนไม่พอดีกับ TINYINT - คุณได้รับข้อผิดพลาดหรือมีการแปลงประเภทเกิดขึ้น?
แจ็คบอกว่าลอง topanswers.xyz

ไม่มีTINYINTในเรื่องนี้ SUMใช้ตัวเลขประเภทใดก็ได้ (แม้แต่ลอย) และสร้างผลลัพธ์ที่เป็นตัวเลข คุณสามารถพิมพ์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.