如何突出显示包含重复数据的行?

如何突出显示包含重复数据的行?

问题描述:

我有以下数据:如何突出显示包含重复数据的行?

+------+-------------------+--------------------+ 
| id |   number |    colour | 
+------+-------------------+--------------------+ 
| 1766 |    53 | red    | 
| 1767 |     3 | green    | 
| 1768 |    202 | green    | 
| 1769 |    52 | blue    | 
| 1770 |    56 | orange    | 
| 1771 |    90 | yellow    | 
| 1772 |    28 | teal    | 
| 1773 |    276 | purple    | 
| 1774 |    23 | black    | 
| 1775 |    23 | orange    | 
+------+-------------------+--------------------+ 

重要的colour列在这里列。我想要显示上述所有行(在HTML表格中),但我想突出显示具有重复颜色的行。即两个绿色行和两个橙色行。

理想情况下,我最终会得到一个额外的列,其中包含一个布尔值(或者任何真正的值),我可以在显示表格时进行检查。

嗯,你不需要任何子查询或任何东西,如果你没有太多的数据。

就凑,你这样显示出来(您需要检查的行或部分)每行:

$hashes = array(); 

while ($row = mysql_fetch_assoc($result)) { 
    $rowHash = md5(implode("", $row), true); 
    $isDuplicate = isset($hashes[$rowHash])); 
    <... printing row contents ...> 
    $hashes[$rowHash] = true; 
} 

该解决方案将工作,直到你有太多的行对页面上的显示。那么你也可以在数据库中缓存散列值。

这可能不是做最有效的方式,但你可以只算你看到当前颜色的次数:

SELECT id, number, colour, 
    (SELECT COUNT(*) FROM table WHERE colour = t.colour) AS repeats 
FROM table t 

Ofcourse,你只是想知道是否有1其他,所以你可以找到另外一行。

SELECT id, number, colour, 
    (SELECT id FROM table WHERE colour = t.colour AND id!=t.id LIMIT 1) AS repeats 
FROM table t 

我不能完全肯定,如果没有第二行会发生什么,所以你可能需要考虑NULL值,但我相信你得到的总体思路;)

+0

做这样的子查询有多昂贵? – Matthew 2011-04-30 09:12:46

+0

第二个不是很贵,虽然你每行都在做。查看'EXPLAIN'(只需在您查询的前面添加单词)输出以查看发生了什么。如果你想要这样做,这取决于事物的大小。 – Nanne 2011-04-30 09:41:03

你可以这样做一个join

SELECT `id`, `number`, `colour` FROM `table` 
INNER JOIN (SELECT COUNT(*) > 1 `duplicate` FROM `table` GROUP BY `colour`) `tmp` USING (`colour`); 

类似:

select table.id, table.number, table.colour, t.count 
from table 
join (select colour, count(colour) as c from table group by colour) as t 
on table.colour=t.colour 

会ÿ ield:

+------+-------------------+--------------------+-----------+ 
| id |   number |    colour |  count | 
+------+-------------------+--------------------+-----------+ 
| 1766 |    53 | red    |   1 | 
| 1767 |     3 | green    |   2 | 
| 1768 |    202 | green    |   2 | 
| 1769 |    52 | blue    |   1 | 
| 1770 |    56 | orange    |   2 | 
| 1771 |    90 | yellow    |   1 | 
| 1772 |    28 | teal    |   1 | 
| 1773 |    276 | purple    |   1 | 
| 1774 |    23 | black    |   1 | 
| 1775 |    23 | orange    |   2 | 
+------+-------------------+--------------------+-----------+