我有一个名为" memberdata"的表。在此表中,列是" id(pk),F_name,L_name,Tel,性别(F / M)和birth_date(varchar)。现在,我需要对memberdata表中的每个重复电话号码进行比较,如果某些记录的性别为M,而其他记录的性别为F,则只保留最老的女性,并将所有其他记录删除到磨砂表。否则,如果所有具有相同性别的记录,则将包含除了包含最旧birth_date的记录之外的所有记录的记录移除到磨砂表。 我很困惑如何在Mysql中编写比较循环代码。 请帮我 欣赏它。
答案 0 :(得分:0)
没有循环。 SQL是一种“设置”语言。所有动作都在一个声明中完成。 (实际上它是固定数量的语句,不依赖于行数。)
将该日期从VARCHAR更改为DATE !!
添加此“复合”索引INDEX(Tel, birth_date)
呜;这是一个复杂的问题。
让我暂时忽略问题的M / F方面 - 即使没有它也很复杂。
“保持”查询。 (我们不会使用它,但这是一个简单的起点。)看看这是否是你需要“保持”的那个:
SELECT m1.*
FROM memberdata AS m1
JOIN
( SELECT Tel, MAX(birth_date) AS birth_date
FROM memberdata
GROUP BY Tel
) AS m2 USING (Tel, birth_date);
如果没关系,那么这个(我称之为“Scrub”查询)应该获取需要擦除的行;是吗?:
SELECT m1.*
FROM memberdata AS m1
LEFT JOIN
( SELECT Tel, MAX(birth_date) AS birth_date
FROM memberdata
GROUP BY Tel
) AS m2 USING (Tel, birth_date)
WHERE m2.id IS NULL;
将行行复制到Scrubs:
INSERT INTO Scrubs
SELECT... -- the second SELECT above ;
从memberdata中删除复制的行
DELETE FROM memberdata
USING Scrubs, memberdata
WHERE Scrubs.id = memberdata.id;
现在,想一想凌乱的M / F要求。让我重新说一下:
看看这是否能获得全F电话:
SELECT Tel,
GROUP_CONCAT(DISTINCT gender ORDER BY gender SEPARATOR '') AS FM
FROM memberdata
GROUP BY Tel
HAVING FM = 'F';
好吧,我们不知何故需要将此查询的JOIN变种到其他(s)到'scrub'查询以将其限制为F等等并运行每个版本。在这些工作之后,DELETE将在单个查询中执行所有DELETE。所以,我猜它将是4个语句(3个INSERT..SELECT,然后是1个DELETE),总计。
对这些评论嗤之以鼻;如果你需要更多的帮助,请回来。
好的,我还没弄明白如何做FM案例。您想要退还这笔咨询吗?我可以寄给你一张0.00美元的支票。