เลือกแถวที่คอลัมน์มีข้อมูลเดียวกันในบันทึกมากกว่าหนึ่งรายการ


28

article_titleผมมีตารางที่มีคอลัมน์ที่เรียกว่า articlesสมมติว่าชื่อตารางเป็น ฉันต้องการค้นหาระเบียนที่มีarticle_titleข้อมูลเหมือนกันในมากกว่าหนึ่งระเบียน

นี่คือสิ่งที่ฉันได้รับ:

select a.* 
from articles a 
where a.article_title = (select article_title 
                         from articles 
                         where article_title = a.article_title 
                         AND a.id <> articles.id)

คำตอบ:


35

HAVING เป็นตัวกรองรวมที่ยอดเยี่ยม ( http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html ) ตัวอย่างเช่นเลือก article_titles ที่มีมากกว่าที่เกิดขึ้น:

SELECT count(*), article_title
FROM articles
GROUP BY article_title
HAVING COUNT(*) > 1;

การเพิ่มคอลัมน์ในอนุประโยค SELECT และ GROUP BY ช่วยให้คุณค้นหารายการที่ซ้ำกันโดยใช้คีย์ผสมของหลายคอลัมน์


2
@ jkushner: แต่ระวังนิสัยใจคอ (หรือข้อบกพร่องที่บางคนอาจเห็นมัน) ในการใช้งานของ MySQL ของGROUP BY: mysqlperformanceblog.com/2006/09/06/…
a_horse_with_no_name

4

ปัญหาของคุณสามารถแก้ไขได้ด้วยแบบสอบถามนี้:

SELECT *
FROM article
WHERE article_title IN (SELECT *
                        FROM (SELECT article_title
                              FROM article
                              GROUP BY article_title
                              HAVING COUNT(article_title) > 1)
                        AS a);

นี่คือคำตอบที่ถูกต้องเพราะจริง ๆ แล้วมันจะส่งคืนแถวที่มีซ้ำกัน
etayluz

3

มีตารางที่มีคอลัมน์ชื่อ article_title สมมติว่าชื่อตารางเป็นบทความ ฉันต้องการค้นหาระเบียนที่ data_title data เหมือนกันในบันทึกมากกว่าหนึ่งรายการ

เสียงเหมือนฉันคุณต้องมีรหัสเพราะคุณต้องการค้นหาบันทึกตามarticle_titleเพราะคุณมีซ้ำ

พื้นฐานต่ำสุด / สูงสุดพร้อม GROUP BY (คุณจะพลาดรหัสเมื่อมีมากกว่า 2 ซ้ำกัน)

SELECT 
  MIN(id) -- for FIFO id's (first id by duplicate)
, MAX(id) -- for LIFO id's (last id by duplicate)
, article_title
, COUNT(*)  
FROM
 articles
WHERE -- Maybe to filter out '' or IS NOT NULL
 article_title != '' AND article_title IS NOT NULL
GROUP BY
 article_title ASC
HAVING
 COUNT(*) >= 2
;

หรือกลับไปที่ denormalisation เพื่อสร้าง CSV สำหรับ LIFO id (รหัสเก่าโดยทำซ้ำ) แต่คุณรู้รหัสทั้งหมดที่นี่ ..

SELECT 
  GROUP_CONCAT(id ORDER BY ASC SEPARATOR ',') -- change to DESC if want the last record first
, article_title
, COUNT(*)  
FROM
 articles
GROUP BY
 article_title ASC
HAVING
 COUNT(*) >= 2
;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.