【问题标题】:MySQL Insert Into Complex StatementMySQL 插入复杂语句
【发布时间】:2016-04-16 21:41:49
【问题描述】:

我正在:

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 服务器版本相对应的手册,在第 3 行的“(SELECT member_id as membersid, (MAX(family_id)+1) as 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 中做到这一点。

Williams 的名字被忽略,因为它没有匹配的姓氏。

TIA

【问题讨论】:

  • 好吧,不是这个,一开始您尝试在 2 个字段中选择 3 个值。数到 10 重新开始
  • 您需要将 VALUES (maxfamily, membersid) 替换为返回 2 个值的选择。 where 子句无关紧要
  • 如果family_id是auto_incremented,你怎么会有多行相同的family_id?
  • 仍在与它斗争。目前只是给出 SQL 错误。 family_id 不会自动递增,因为它不是表的唯一索引。它只是一个允许重复的索引。

标签: mysql


【解决方案1】:

试试这个。

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

【讨论】:

  • #1054 - 'field list' 中的未知列 'members.id' 成员表有一个名为 member_id 的字段。我试图遵循您的陈述,但我看不到第二个查询中是如何提出 members_id 的。感谢您的帮助,我以为我错过了第三个查询。现在我开始看到它了。
  • 然后将出现的id 替换为member_id
【解决方案2】:

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 上的 members 表:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多