如何突出显示包含重复数据的行?
问题描述:
我有以下数据:如何突出显示包含重复数据的行?
+------+-------------------+--------------------+
| 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值,但我相信你得到的总体思路;)
答
你可以这样做一个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 |
+------+-------------------+--------------------+-----------+
做这样的子查询有多昂贵? – Matthew 2011-04-30 09:12:46
第二个不是很贵,虽然你每行都在做。查看'EXPLAIN'(只需在您查询的前面添加单词)输出以查看发生了什么。如果你想要这样做,这取决于事物的大小。 – Nanne 2011-04-30 09:41:03