处理相关条目的PHP/MySQL代码
我有一张桌子:处理相关条目的PHP/MySQL代码,php,mysql,Php,Mysql,我有一张桌子: Name GroupID etc... ABC ABC DEF DEF DEF KKK LLL III III 我想要一个PHP/MYSQL的组合来处理以下内容: Name GroupID etc... ABC 1 ABC 1 DEF 2 DEF 2 DEF 2 KKK 0 LLL 0 III 3 III 3 例如,如果行中存在具有重复名
Name GroupID etc...
ABC
ABC
DEF
DEF
DEF
KKK
LLL
III
III
我想要一个PHP/MYSQL的组合来处理以下内容:
Name GroupID etc...
ABC 1
ABC 1
DEF 2
DEF 2
DEF 2
KKK 0
LLL 0
III 3
III 3
例如,如果行中存在具有重复名称的条目(完全匹配字符串),它将为所有具有该名称的条目分配一个GroupID(自动递增)。如果条目是唯一的名称,它将为GroupID分配一个0
我的表有250000个条目,实现这一点的最快方法是什么?工作代码会很好,但高级算法足以让我继续工作
谢谢 这可以通过一个快速的PHP脚本来完成,但我喜欢让数据库自己处理它的想法 您可能可以通过一个聪明的
UPDATE
join来实现这一点,但是因为我不能测试它,所以我将使用一个临时表。其思想是为计数大于1的Name
选择所有值,并将行号分配到临时表中。然后使用更新联接修改原始表中的GroupID
SET @rownum=0;
CREATE TEMPORARY TABLE groupnums (groupid INT, Name VARCHAR(16), numgroups INT)
SELECT
@rownum := @rownum + 1 AS groupid,
Name,
COUNT(*) AS numgroups
FROM original_table
GROUP BY Name
HAVING COUNT(*) > 1
UPDATE
original_table
JOIN groupnums ON original_table.Name = groupnums.Name
SET original_table.GroupID = groupnums.groupid
然后将其余的设置为0
UPDATE original_table SET GroupID='0' WHERE GroupID IS NULL
然后扔掉临时桌子
DROP TABLE groupnums;
更新:
在为我自己快速测试之后,我发现尽管它有效,但您不会直接获得groupid
的增量值。@rownum
对于每一行而不是每一组都是递增的,因此您将得到如下组,其中有间隙
/* Sample results - groups work, but have gaps between GroupID */
Name GroupID etc...
ABC 1
ABC 1
DEF 3
DEF 3
DEF 3
KKK 0
LLL 0
III 6
III 6
更新2我有点把它复杂化了。
仔细想想,根本不需要@rownum
。只需在临时表中使用自动递增id。这将产生增量的GroupID
,其间没有间隙。如上所述,使用相同的UPDATE
语句对此进行连接
CREATE TEMPORARY TABLE groupnums (groupid INT NOT NULL AUTO_INCREMENT, Name VARCHAR(16), numgroups INT)
SELECT
NULL AS groupid
Name,
COUNT(*) AS numgroups
FROM original_table
GROUP BY Name
HAVING COUNT(*) > 1
我的php方法是,当当前和以前的名称与Groupid不匹配时,按顺序循环遍历名称,跟踪以前的名称。在运行时更新每一行。然而,有一种超级聪明的mysql方式哦,看,它现在在那里:-)