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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.