Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.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 删除重复项但保留最早日期_Php_Mysql - Fatal编程技术网

Php 删除重复项但保留最早日期

Php 删除重复项但保留最早日期,php,mysql,Php,Mysql,不知何故,我的数据库表基于一个名为kdaccount的字段复制了一组值 我试图做的是删除所有重复的KDAccount,除了一个,我希望这一个是最早提交的日期 我编写了一个查询来识别重复的帐户,但现在我确定了如何构造mysql查询来删除它们 $getVendors = mysql_query("SELECT vendor, nameid, kdaccount, MIN(dw_vendors.submitteddate) as `smallestDate`

不知何故,我的数据库表基于一个名为kdaccount的字段复制了一组值

我试图做的是删除所有重复的KDAccount,除了一个,我希望这一个是最早提交的日期

我编写了一个查询来识别重复的帐户,但现在我确定了如何构造mysql查询来删除它们

$getVendors = mysql_query("SELECT vendor, nameid, kdaccount, MIN(dw_vendors.submitteddate) as `smallestDate` 
                                                FROM pr_po_main 
                                                LEFT JOIN dw_vendors ON pr_po_main.vendor = dw_vendors.kdaccount 
                                                WHERE dw_vendors.submitteddate <> '' GROUP BY vendor HAVING COUNT(dw_vendors.kdaccount) > '1'") or die("Get Vendors: " . mysql_error());
$getVendors=mysql\u查询(“选择vendor、nameid、kdaccount、MIN(dw\u vendors.submitteddate)作为'smallestDate`”
从pr_po_main
在pr_po_main.vendor=dw_vendors.kdaccount上左键加入dw_供应商
其中,dw_vendors.submitteddate“”按具有计数(dw_vendors.kdaccount)>“1”或死亡(“获取供应商:”.mysql_error())的供应商分组;

希望以下解决方案对您有所帮助

1.创建dw_供应商的重复表

创建类似dw_供应商的dw_供应商dup表

2.将KDA帐户设置为唯一

ALTER TABLE dw_vendors_dup ADD UNIQUE (kdaccount);
3.将现有值插入新表,忽略重复项

INSERT IGNORE INTO dw_vendors_dup (vendor, nameid, kdaccount, submitteddate) 
SELECT vendor, nameid, kdaccount, submitteddate FROM dw_vendors
ORDER BY submitteddate
4.删除旧表dw_供应商
并将重复的一个重命名为dw_供应商

这里发布了一个如何在Sql Fiddle上实现这一点的示例

这应该告诉你事情的原理

以防万一,这里是代码

DELETE Test 
FROM Test 
LEFT OUTER JOIN (SELECT MIN(comp) AS compMin, groupval
                FROM Test
                GROUP BY groupval) AS Test2 
ON Test.groupval = Test2.groupval AND Test.comp <> Test2.compmin
WHERE Test2.groupval IS NOT NULL 

Edit:如果没有having子句,这应该行得通。顺便说一句,您应该考虑使用PDO或MySQLi以及准备好的语句,因为mysql函数已经被弃用。您想从两个表中删除行还是只从一个表中删除行?
delete from table WHERE id IN()
用任何主键替换id,并首先在测试环境中进行测试。这是假设您的选择只返回副本,而不是原件!
CREATE TABLE Test 
    (
        comp int, 
        groupval int 
    );