Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理相关条目的PHP/MySQL代码_Php_Mysql - Fatal编程技术网

处理相关条目的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方式哦,看,它现在在那里:-)