chọn các hàng trong đó cột chứa cùng một dữ liệu trong nhiều bản ghi


28

Tôi có một bảng có một cột được gọi article_title. Hãy nói tên bảng là articles. Tôi cần tìm ra các bản ghi trong đó article_titledữ liệu giống nhau trên nhiều bản ghi.

Đây là những gì tôi đã có:

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)

Câu trả lời:


35

HAVING là một bộ lọc tổng hợp tuyệt vời. ( http://dev.mysql.com/doc/refman/5.6/en/group-by-extensions.html ) Ví dụ: chọn article_title với nhiều hơn sự xuất hiện:

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

Thêm các cột vào mệnh đề SELECT và GROUP BY cho phép bạn xác định vị trí trùng lặp dựa trên khóa tổng hợp của nhiều cột.


2
@jkushner: nhưng hãy cẩn thận của những khuyết tật (hoặc lỗi như một số có thể nhìn thấy nó) trong việc thực hiện MySQL của GROUP BY: mysqlperformanceblog.com/2006/09/06/...
a_horse_with_no_name

4

Vấn đề của bạn có thể được giải quyết với truy vấn này:

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);

Đây là câu trả lời đúng bởi vì nó thực sự trả về các hàng có trùng lặp
etayluz

3

có một bảng có một cột được gọi là article_title. Hãy nói tên bảng là bài viết. Tôi cần tìm ra các bản ghi trong đó dữ liệu article_title giống nhau trên nhiều bản ghi.

Âm thanh như với tôi bạn cũng cần phải có id vì bạn muốn tìm bản ghi dựa trên article_titlevì bạn có bản sao

Cơ bản MIN / MAX với NHÓM THEO (bạn sẽ bỏ lỡ id khi có nhiều hơn 2 bản sao)

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
;

Hoặc quay lại việc không chuẩn hóa để tạo CSV cho id LIFO (id cũ hơn do trùng lặp) nhưng bạn biết tất cả id ở đây ..

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
;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.