البحث عن سجلات مكررة في MySQL




duplicates (15)

أرغب في سحب سجلات مكررة في قاعدة بيانات MySQL. يمكن القيام بذلك مع:

SELECT address, count(id) as cnt FROM list
GROUP BY address HAVING cnt > 1

مما يؤدي إلى:

100 MAIN ST    2

أرغب في سحبها بحيث تعرض كل صف مكرر. شيء مثل:

JIM    JONES    100 MAIN ST
JOHN   SMITH    100 MAIN ST

أي أفكار حول كيف يمكن القيام بذلك؟ أحاول تجنب القيام بالأول ثم البحث عن التكرارات باستعلام ثانٍ في الكود.


أسرع إجراء استعلامات إزالة التكرار:

/* create temp table with one primary column id */
INSERT INTO temp(id) SELECT MIN(id) FROM list GROUP BY (isbn) HAVING COUNT(*)>1;
DELETE FROM list WHERE id IN (SELECT id FROM temp);
DELETE FROM temp;

أليس هذا أسهل:

SELECT *
FROM tc_tariff_groups
GROUP BY group_id
HAVING COUNT(group_id) >1

؟


الحل الآخر هو استخدام الأسماء المستعارة للجدول ، مثل:

SELECT p1.id, p2.id, p1.address
FROM list AS p1, list AS p2
WHERE p1.address = p2.address
AND p1.id != p2.id

كل ما تقوم به بالفعل في هذه الحالة هو أخذ جدول القائمة الأصلي ، وإنشاء جدولين retend p - p 1 و p 2 - خارج ذلك ، ثم تنفيذ ارتباط في عمود العنوان (السطر 3). يضمن السطر الرابع عدم ظهور نفس السجل عدة مرات في مجموعة النتائج ("التكرارات المتكررة").


المفتاح هو إعادة كتابة هذا الاستعلام بحيث يمكن استخدامه بمثابة استعلام فرعي.

SELECT firstname, 
   lastname, 
   list.address 
FROM list
   INNER JOIN (SELECT address
               FROM   list
               GROUP  BY address
               HAVING COUNT(id) > 1) dup
           ON list.address = dup.address;

سيوضح لك هذا أيضًا عدد التكرارات التي سيحدثها وسيطلب النتائج دون صلات

SELECT  `Language` , id, COUNT( id ) AS how_many
FROM  `languages` 
GROUP BY  `Language` 
HAVING how_many >=2
ORDER BY how_many DESC

شخصيا هذا الاستعلام قد حل مشكلتي:

SELECT `SUB_ID`, COUNT(SRV_KW_ID) as subscriptions FROM `SUB_SUBSCR` group by SUB_ID, SRV_KW_ID HAVING subscriptions > 1;

ما يفعله هذا البرنامج النصي هو إظهار كافة معرّفات المشترك الموجودة أكثر من مرة في الجدول وعدد التكرارات التي تم العثور عليها.

هذه أعمدة الجدول:

| SUB_SUBSCR_ID | int(11)     | NO   | PRI | NULL    | auto_increment |
| MSI_ALIAS     | varchar(64) | YES  | UNI | NULL    |                |
| SUB_ID        | int(11)     | NO   | MUL | NULL    |                |    
| SRV_KW_ID     | int(11)     | NO   | MUL | NULL    |                |

آمل أن يكون من المفيد لك سواء!


لماذا ليس مجرد INNER الانضمام إلى الجدول مع نفسه؟

SELECT a.firstname, a.lastname, a.address
FROM list a
INNER JOIN list b ON a.address = b.address
WHERE a.id <> b.id

وهناك حاجة إلى DISTINCT إذا كان يمكن أن يوجد العنوان أكثر من مرتين.


لن تكون فعالة للغاية ، ولكن يجب أن تعمل:

SELECT *
FROM list AS outer
WHERE (SELECT COUNT(*)
        FROM list AS inner
        WHERE inner.address = outer.address) > 1;

يمكننا العثور على التكرارات يعتمد على أكثر من حقل واحد أيضا. لهذه الحالات يمكنك استخدام التنسيق أدناه.

SELECT COUNT(*), column1, column2 
FROM tablename
GROUP BY column1, column2
HAVING COUNT(*)>1;

select address from list where address = any (select address from (select address, count(id) cnt from list group by address having cnt > 1 ) as t1) order by address

إرجاع الاستعلام الفرعي الداخلي الصفوف مع عنوان مكرر ثم إرجاع الاستعلام الفرعي الخارجي عنوان العمود للحصول على عنوان مع التكرارات. يجب أن يقوم الاستعلام الفرعي الخارجي بإرجاع عمود واحد فقط لأنه يستخدم كمعامل للمشغل '= أي'


    Find duplicate Records:

    Suppose we have table : Student 
    student_id int
    student_name varchar
    Records:
    +------------+---------------------+
    | student_id | student_name        |
    +------------+---------------------+
    |        101 | usman               |
    |        101 | usman               |
    |        101 | usman               |
    |        102 | usmanyaqoob         |
    |        103 | muhammadusmanyaqoob |
    |        103 | muhammadusmanyaqoob |
    +------------+---------------------+

    Now we want to see duplicate records
    Use this query:


   select student_name,student_id ,count(*) c from student group by student_id,student_name having c>1;

+--------------------+------------+---+
| student_name        | student_id | c |
+---------------------+------------+---+
| usman               |        101 | 3 |
| muhammadusmanyaqoob |        103 | 2 |
+---------------------+------------+---+

    SELECT *
    FROM (SELECT  address, COUNT(id) AS cnt
    FROM list
    GROUP BY address
    HAVING ( COUNT(id) > 1 ))

SELECT date FROM logs group by date having count(*) >= 2

SELECT t.*,(select count(*) from city as tt where tt.name=t.name) as count FROM `city` as t where (select count(*) from city as tt where tt.name=t.name) > 1 order by count desc

استبدال المدينة مع الجدول الخاص بك. استبدل الاسم باسم المجال الخاص بك


select `cityname` from `codcities` group by `cityname` having count(*)>=2

هذا هو طلب البحث المماثل الذي طلبته و 200٪ من العمل والسهولة أيضًا. استمتع!!!





duplicates