【问题标题】:Merge MySQL columns exclude duplicates合并 MySQL 列排除重复项
【发布时间】:2012-09-26 06:51:24
【问题描述】:

我有这两张表:

desc students
+-----------------------+---------+------+-----+---------+----------------+
| Field                 | Type    | Null | Key | Default | Extra          |
+-----------------------+---------+------+-----+---------+----------------+
| student_id            | int(11) | NO   | PRI | NULL    | auto_increment |
| student_ticket_number | int(11) | YES  |     | 0       |                |
+-----------------------+---------+------+-----+---------+----------------+

desc studentdates
+-----------------------+---------+------+-----+---------+----------------+
| Field                 | Type    | Null | Key | Default | Extra          |
+-----------------------+---------+------+-----+---------+----------------+
| student_date_id       | int(11) | NO   | PRI | NULL    | auto_increment |
| student_id            | int(11) | YES  |     | NULL    |                |
| student_ticket_number | int(11) | YES  |     | 0       |                |
+-----------------------+---------+------+-----+---------+----------------+

我想将students.student_ticket_number 列移动到studentdates.student_ticket_number 字段student_id 匹配的位置。

因此,如果用户 John 的 student_id = 1 将他的票号(例如 1234)从 students.student_ticket_number 移动到 studentdates.student_ticket_number WHERE student_id = '1'

在表studentdates.student_id 中可以有多个相同的记录,那么我想使用最低的studentdates.student_date_id 并跳过其他记录。如果不清楚,请告诉我。

我想我需要以某种方式进行子查询,但如何?

【问题讨论】:

    标签: mysql merge move


    【解决方案1】:

    您需要在子查询中获得最小的student_date_ID,然后将其与其他表连接。试试这个,

    罢工>

    UPDATE  students a
            INNER JOIN studentdates b
                ON a.student_ID = b.student_ID
            INNER JOIN
            (
                SELECT  student_ID, MIN(student_date_ID) minID
                FROM    studentDates
                GROUP BY student_ID
            ) c ON b.student_ID = c.student_ID AND
                   b.student_date_id = c.minID
    SET     a.student_ticket_number = b.student_ticket_number
    WHERE   a.student_id = '1'
    

    UPDATE  students a
            INNER JOIN studentdates b
                ON a.student_ID = b.student_ID
            INNER JOIN
            (
                SELECT  student_ID, MIN(student_date_ID) minID
                FROM    studentDates
                GROUP BY student_ID
            ) c ON b.student_ID = c.student_ID AND
                   b.student_date_id = c.minID
    SET     b.student_ticket_number = a.student_ticket_number
    WHERE   a.student_id = '1'
    

    【讨论】:

    • 您好,感谢您的回复。这看起来不错但是我需要UPDATEstudentdates 而不是students 但我想我可以在你的查询中折腾所有东西:)
    • @David 通过交换别名 SET b.student_ticket_number = a.student_ticket_number 来完成这项工作?
    【解决方案2】:
    Update studentdates sd,students s,(select student_id,min(student_date_id) as minstudDateId from studentdates group by student_id) sm
    SET sd.student_ticket_number = s.student_ticket_number 
    where sd.student_id=s.student_id
    and sd.student_id=sm.student_id
    and sd.student_date_id=sm.minstudDateId
    

    【讨论】:

    • 错误代码:1093。您不能在 FROM 子句中指定目标表 'sd' 进行更新
    • 您好,我使用的是 John Woos 查询。不过,感谢您抽出宝贵的时间。为您的帖子点赞
    猜你喜欢
    • 2013-05-02
    • 2016-10-24
    • 1970-01-01
    • 2016-03-23
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    相关资源
    最近更新 更多