从表中查找重复的行/记录

时间:2013-07-20 13:17:59

标签: php sql

这是我的表结构,

enter image description here

我尝试运行查询

$sql = mysql_query("SELECT content,niche, COUNT(content) TotalCount FROM table_name GROUP by content HAVING COUNT(content)>=2");

我认为是给我核心结果,但有问题用php列出结果并删除按钮删除重复行之一

我在php中得到结果

内容ID - 利基ID - TotalCount
208 - 2 - 2
210 - 32 - 3

但结果应该是

内容ID - 利基ID - TotalCount
208 - 2 - 2
208 - 2 - 2
210 - 32 - 3
210 - 32 - 3
210 - 32 - 3

即时尝试使用php显示结果

while($row = mysql_fetch_assoc($sql)) {            
    $array[] = $row;
}
foreach($array as $row) {
    echo $row['content']." - ".$row['niche']." - ".$row['TotalCount']."<br>";
}

3 个答案:

答案 0 :(得分:2)

GROUP BY会合并您正在分组的字段上的结果,在这种情况下为content - 因此您只能看到两个结果。

如果您想保留GROUP BY技术,还可以使用GROUP_CONCAT(niche)为给定的niche值提取逗号分隔的每个content列表:< / p>

SELECT
    content,
    GROUP_CONCAT(niche) AS niche,
    COUNT(content) TotalCount
FROM
    table_name
GROUP BY
    content
HAVING
    COUNT(content)>=2;

然后,您可以使用PHP的explode(',', $row['niche'])获取每个不同的值,然后使用它们来确定要删除的值。

foreach($array as $row) {
    $niches = explode(',', $row['niche']);
    foreach ($niches as $niche) {
        echo $row['content'] . " - " . $niche . " - " . $row['TotalCount'] . "<br />";
    }
}

答案 1 :(得分:1)

我认为这就是你所要求的,所有重复的行(包含row_id)以及重复的次数;

SELECT a.row_id, a.content, a.niche, cnt
FROM table_name a
JOIN (
  SELECT MIN(row_id) m, COUNT(*) cnt, niche,content
  FROM table_name
  GROUP BY content,niche
  HAVING COUNT(*)>1
) b
  ON a.niche=b.niche
 AND a.content=b.content

An SQLfiddle to test with

答案 2 :(得分:0)

在sql中进行以下更改:

$sql = mysql_query("SELECT content,niche, COUNT(content) TotalCount FROM table_name HAVING COUNT(content)>=2");