如何在mysql中编写比较循环

时间:2015-02-25 01:20:20

标签: mysql

我有一个名为" memberdata"的表。在此表中,列是" id(pk),F_name,L_name,Tel,性别(F / M)和birth_date(varchar)。现在,我需要对memberdata表中的每个重复电话号码进行比较,如果某些记录的性别为M,而其他记录的性别为F,则只保留最老的女性,并将所有其他记录删除到磨砂表。否则,如果所有具有相同性别的记录,则将包含除了包含最旧birth_date的记录之外的所有记录的记录移除到磨砂表。 我很困惑如何在Mysql中编写比较循环代码。 请帮我 欣赏它。

1 个答案:

答案 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(或全部是M),则除了最老的以外都擦洗;
  • 如果是M和F的混合物,除了最老的F之外都擦洗(并保留所有M?)。

看看这是否能获得全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美元的支票。