gpt4 book ai didi

用于处理关联条目的 PHP/MySQL 代码

转载 作者:行者123 更新时间:2023-11-29 14:24:30 25 4
gpt4 key购买 nike

我有 table :

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

我的表有 250,000 个条目,实现此目的最快的方法是什么?工作代码会很好,但高级算法足以让我继续前进。

谢谢!

最佳答案

这可以通过一个快速的 PHP 脚本来完成,但我喜欢让数据库自行处理它的想法。

您可能可以通过巧妙的 UPDATE 连接来做到这一点,但因为我无法测试它,所以我将使用临时表。这个想法是选择 Name 计数 > 1 的所有值,并将行号分配给它们到临时表中。然后使用更新联接修改原表中的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/MySQL 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11235582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com