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

时间:2011-04-30 07:59:19

标签: php mysql

我有以下数据:

+------+-------------------+--------------------+
| 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表格中),但我想突出显示任何具有重复颜色的行。即两个绿色行和两个橙色行。

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

4 个答案:

答案 0 :(得分:1)

你可以做join

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

答案 1 :(得分:0)

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

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

当然,你只想知道是否有另外一个,所以你可以去寻找另外一行。

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

我不完全确定如果没有第二行会发生什么,所以你可能需要在那里考虑NULL值,但我认为你得到了一般的想法;)

答案 2 :(得分:0)

类似的东西:

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

会产生:

+------+-------------------+--------------------+-----------+
| 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 |
+------+-------------------+--------------------+-----------+

答案 3 :(得分:0)

嗯,如果您没有太多数据,不需要任何子查询或任何内容。

只需散列每行(或您需要检查的行的一部分),就像显示它们一样:

$hashes = array();

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

此解决方案将一直有效,直到您有太多行显示在页面上。然后,您还可以在数据库中缓存哈希值。