MySQL插入复杂语句

时间:2016-04-16 21:41:50

标签: mysql

我正走在:

的道路上
INSERT INTO family (family_id, member_id)
VALUES (maxfamily, membersid)
(SELECT member_id as membersid, (MAX(family_id)+1) as maxfamily
FROM members
GROUP BY lname
HAVING COUNT (lname)>1)

当前错误:检查与您的MySQL服务器版本对应的手册,以便在'(SELECT member_id as membersid,(MAX(family_id)+1)附近使用正确的语法作为第3行的maxfamily FROM member'

我假设这是来自MAX(family_id),因为它不知道当前最大数字没有给予族表的参考?

意向:

从成员表中查找姓氏相同的人。使用此查询将新记录插入族表。

Example:
members table
Andersen, Fred, id=288
Andersen, Smith, id=289
Smith, Peter, id=385
Smith, Elizabeth, id=404
Williams, Kevin, id=408

family table (currently empty)
family_id, member_id
1, 288
1, 289 (this covers the Anderson family)
2, 385
2, 404 (this covers the Smith family)

问题:如何为此任务创建正确的查询?请注意,系列ID会根据上一个最大值自动递增。

我知道如何在编程中执行此操作我只想在直接SQL中执行此操作。

威廉姆斯名称被忽略,因为它没有匹配的姓氏。

TIA

2 个答案:

答案 0 :(得分:2)

试一试。

SET @prev_lname = '', @id = 0;
INSERT INTO family(family_id,member_id)
SELECT family_id, id
FROM
  (SELECT members.lname,members.id,
       CASE WHEN @prev_lname = members.lname THEN @id
            ELSE @id := IFNULL(@id,0) + 1
            END as family_id,
       @prev_lname := members.lname
  FROM 
  members,(SELECT lname
            FROM members
            GROUP BY lname
            HAVING COUNT(*)>1) AS qualify
WHERE members.lname = qualify.lname
ORDER BY members.lname ASC
)AS T;

sqlfiddle

答案 1 :(得分:1)

1)获取姓氏:

select lname
from members
group by lname
having count(lname) > 1;

2)列举姓氏姓氏:

select lname, (@fid := @fid + 1) as family_id
from members, (select @fid := 0) dummy
group by lname
having count(lname) > 1;

3)加入lname:

上的成员表
select f.family_id, m.member_id
from (
    select lname, (@fid := @fid + 1) as family_id
    from members, (select @fid := 0) dummy
    group by lname
    having count(lname) > 1
) f
join members m on m.lname = f.lname;

4)结果(创建插入语句):

insert into family (family_id, member_id)
    select f.family_id, m.member_id
    from (
        select lname, (@fid := @fid + 1) as family_id
        from members, (select @fid := 0) dummy
        group by lname
        having count(lname) > 1
    ) f
    join members m on m.lname = f.lname

http://sqlfiddle.com/#!9/209a55/2