เลือกตำแหน่งที่จะนับหนึ่งเขตข้อมูลมากกว่าหนึ่งเขตข้อมูล


100

ฉันต้องการทำสิ่งนี้:

SELECT * 
  FROM db.table 
 WHERE COUNT(someField) > 1

ฉันจะบรรลุสิ่งนี้ใน MySql ได้อย่างไร?

คำตอบ:


146

ใช้HAVINGไม่ใช่WHEREอนุประโยคสำหรับการเปรียบเทียบผลลัพธ์รวม

รับแบบสอบถามตามมูลค่า:

SELECT * 
  FROM db.table 
HAVING COUNT(someField) > 1

ตามGROUP BYหลักการแล้วควรมีการกำหนดไว้สำหรับการประเมินค่าที่เหมาะสมในHAVINGประโยค แต่MySQL อนุญาตให้ซ่อนคอลัมน์จาก GROUP BY ...

นี่เป็นการเตรียมพร้อมสำหรับข้อ จำกัด เฉพาะsomeFieldหรือไม่? ดูเหมือนว่ามันจะ ...


11
ต้องการGROUP BYอย่างแน่นอน (เว้นแต่ว่านี่จะเป็นสิ่งที่ไม่ได้มาตรฐาน MySQL)?
Martin Smith

@Martin Smith: รับแบบสอบถามที่มูลค่า; แก้ไขปัญหา GROUP BY (รวมถึงคุณลักษณะคอลัมน์ที่ซ่อนอยู่)
OMG Ponies

"ดูเหมือนว่ามันควรจะ ... " ทำไม? ฉันต้องการการศึกษาเกี่ยวกับเรื่องนี้ :)
Dave

ดังนั้นสิ่งนี้จะส่งคืนทั้งตารางหากมีมากกว่า 2 ค่าที่ไม่ใช่someFieldค่าว่างหรือชุดผลลัพธ์ว่างหากไม่มี
Martin Smith

@ Dave: ถ้าคุณอยู่ในตำแหน่งที่คุณต้องตรวจสอบและแก้ไขข้อมูลที่ไม่ดีเป็นระยะ ๆ คุณจะไม่อยากหยุดสถานการณ์ไม่ให้เกิดขึ้นตั้งแต่แรกหรือไม่? MySQL ใช้ข้อ จำกัด เฉพาะเป็นดัชนี - สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสาร CREATE INDEX
OMG Ponies

18
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3

3
ข้อแม้เดียวที่นี่ (อย่างน้อยใน 5.1.46- ชุมชน MySQL Community Server (GPL)) คือ "ทุกตารางที่ได้มาต้องมีนามแฝงของตัวเอง" ซึ่งจะทำให้ sql ของคุณดูเหมือน: ชื่อผู้ใช้ SELECT, มึนจาก (เลือกชื่อผู้ใช้, นับ (ชื่อผู้ใช้) เป็นจำนวนนับจากลูกค้า GROUP BY ชื่อผู้ใช้) เป็น my_table WHERE มึน> 3
D_K




1

ตามที่ OMG Ponies กล่าวไว้ประโยคที่มีคือสิ่งที่คุณต้องการ อย่างไรก็ตามหากคุณหวังว่าจะได้รับแถวที่ไม่ต่อเนื่องแทนที่จะเป็นข้อมูลสรุป (การ "มี" จะสร้างข้อมูลสรุป) - ไม่สามารถทำได้ในคำสั่งเดียว คุณต้องใช้สองคำสั่งในกรณีนั้น


1
ไม่เป็นความจริงทั้งหมด - ใช้ GROUP BY เพื่อจัดการกับสิ่งที่ HAVING กำลังใช้อยู่
OMG Ponies

1

ฉันยกตัวอย่าง Group By ระหว่างสองตารางใน Sql:

Select cn.name,ct.name,count(ct.id) totalcity from city ct left join country cn on ct.countryid = cn.id Group By cn.name,ct.name Having totalcity > 2



1

สำหรับฉันไม่มีกลุ่มโดยเพียงแค่ส่งคืนผลลัพธ์ที่ว่างเปล่า ดังนั้นฉันเดาว่าการมีกลุ่มโดยการมีคำสั่งนั้นสำคัญทีเดียว


-2

นอกจากนี้ยังควรกล่าวถึงว่า "pk" ควรเป็นคีย์ฟิลด์ เข้าร่วมด้วยตนเอง

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk 

โดย Bill Karwin ให้บันทึกทั้งหมดที่ซ้ำกันซึ่งเป็นสิ่งที่ฉันต้องการ เนื่องจากบางรายการมีมากกว่าสองรายการคุณจึงสามารถรับบันทึกเดียวกันได้มากกว่าหนึ่งครั้ง ฉันเขียนทั้งหมดลงในตารางอื่นที่มีฟิลด์เดียวกันเพื่อกำจัดระเบียนเดียวกันโดยการกดฟิลด์คีย์ ฉันเหนื่อย

SELECT * FROM db.table HAVING COUNT(someField) > 1

ข้างต้นก่อน. ข้อมูลที่ส่งกลับมาให้ข้อมูลที่ซ้ำกันเพียงรายการเดียวซึ่งน้อยกว่า 1/2 ของสิ่งที่ให้คุณ แต่การนับจะดีถ้านั่นคือทั้งหมดที่คุณต้องการ


3
นี่ไม่ใช่คำตอบจริงๆ
anon582847382
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.