ฉันต้องการทำสิ่งนี้:
SELECT *
FROM db.table
WHERE COUNT(someField) > 1
ฉันจะบรรลุสิ่งนี้ใน MySql ได้อย่างไร?
ฉันต้องการทำสิ่งนี้:
SELECT *
FROM db.table
WHERE COUNT(someField) > 1
ฉันจะบรรลุสิ่งนี้ใน MySql ได้อย่างไร?
คำตอบ:
ใช้HAVING
ไม่ใช่WHERE
อนุประโยคสำหรับการเปรียบเทียบผลลัพธ์รวม
รับแบบสอบถามตามมูลค่า:
SELECT *
FROM db.table
HAVING COUNT(someField) > 1
ตามGROUP BY
หลักการแล้วควรมีการกำหนดไว้สำหรับการประเมินค่าที่เหมาะสมในHAVING
ประโยค แต่MySQL อนุญาตให้ซ่อนคอลัมน์จาก GROUP BY ...
นี่เป็นการเตรียมพร้อมสำหรับข้อ จำกัด เฉพาะsomeField
หรือไม่? ดูเหมือนว่ามันจะ ...
someField
ค่าว่างหรือชุดผลลัพธ์ว่างหากไม่มี
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3
คุณสามารถทำได้ด้วยการเข้าร่วมด้วยตนเอง:
SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk
ได้แล้ว:
SELECT Field1, COUNT(Field1)
FROM Table1
GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc
ทางเดียว
SELECT t1.*
FROM db.table t1
WHERE exists
(SELECT *
FROM db.table t2
where t1.pk != t2.pk
and t1.someField = t2.someField)
ตามที่ OMG Ponies กล่าวไว้ประโยคที่มีคือสิ่งที่คุณต้องการ อย่างไรก็ตามหากคุณหวังว่าจะได้รับแถวที่ไม่ต่อเนื่องแทนที่จะเป็นข้อมูลสรุป (การ "มี" จะสร้างข้อมูลสรุป) - ไม่สามารถทำได้ในคำสั่งเดียว คุณต้องใช้สองคำสั่งในกรณีนั้น
ฉันยกตัวอย่าง 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
สำหรับฉันไม่มีกลุ่มโดยเพียงแค่ส่งคืนผลลัพธ์ที่ว่างเปล่า ดังนั้นฉันเดาว่าการมีกลุ่มโดยการมีคำสั่งนั้นสำคัญทีเดียว
นอกจากนี้ยังควรกล่าวถึงว่า "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 ของสิ่งที่ให้คุณ แต่การนับจะดีถ้านั่นคือทั้งหมดที่คุณต้องการ
GROUP BY
อย่างแน่นอน (เว้นแต่ว่านี่จะเป็นสิ่งที่ไม่ได้มาตรฐาน MySQL)?