【问题标题】:MySQL query with limit on parent table not on child tableMySQL查询限制父表而不是子表
【发布时间】:2014-05-10 08:27:47
【问题描述】:

我有两个表 studentsstudent_updates

  CREATE TABLE IF NOT EXISTS `students` (
          `id` int(11) NOT NULL AUTO_INCREMENT,
          `name` varchar(20) NOT NULL,
          `class` varchar(20) NOT NULL,
          PRIMARY KEY (`id`)
        ) ENGINE=InnoDB

Data: 
    id  name class
    1   A    X
    2   B    IX
    3   C    X
    4   D    XI

每个学生都有零个或多个更新。

    CREATE TABLE IF NOT EXISTS `student_updates` (
                          `id` int(11) NOT NULL AUTO_INCREMENT,
                          `sid` int(11) NOT NULL,
                          `updates` text NOT NULL,
                          PRIMARY KEY (`id`),
                          KEY `fk_sid` (`sid`)
                ) ENGINE=InnoDB 
            ALTER TABLE `student_updates`
              ADD CONSTRAINT `fk_sid` FOREIGN KEY (`sid`) REFERENCES `students` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

Data : 
        id  sid updates
        1   1   U1
        2   1   U2
        3   1   U3
        4   1   U4
        5   2   U5
        6   2   U6
        7   2   U7

现在我想要一个查询来获取学生的更新记录,但对学生(父表)有限制,而不是对子表(student_updates)有限制。 例如:

SELECT s.id, s.name, su.id, su.updates
FROM students AS s
LEFT JOIN `student_updates` AS su ON s.id = su.sid
LIMIT 2  

结果:

id  name    id  updates
1   A   1   U1
1   A   2   U2

但我想要 2 个父记录及其所有更新(子记录)。

例如:

id  name    id  updates
1   A   1   U1
1   A   2   U2
1   A   3   U3
1   A   4   U4
2   B   5   U5
2   B   6   U6
2   B   7   U7

但根据学生表(父表)限制结果

尤其需要优化解决方案,因为学生表有大约 100 万条记录,而 student_updates 有超过 4000 万条记录。

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    创建一个有限制的子查询,然后从那里创建连接。

    SELECT s.id, s.name, su.id, su.updates
    FROM (select id, name from students limit 2) AS s
    LEFT JOIN `student_updates` AS su ON s.id = su.sid
    

    【讨论】:

      【解决方案2】:
      SELECT s.id, s.name, su.id, su.updates
      FROM students AS s
      LEFT JOIN `student_updates` AS su ON s.id = su.sid
      where s.id in (select id from students limit 2)
      

      【讨论】:

      • +1 这也可以,但性能不佳
      【解决方案3】:

      你可以使用CROSS JOIN

      SELECT s.id, s.name, su.id, su.updates
      FROM students AS s
      CROSS JOIN (select su.id, su.updates FROM `student_updates` limit 1 AS su WHERE s.id = su.sid)
      

      【讨论】:

        【解决方案4】:

        在 where 子句中使用 IN 运算符

        SELECT s.id, s.name, su.id, su.updates
        FROM students AS s
        LEFT JOIN `student_updates` AS su ON s.id = su.sid
        WHERE su.sid IN ('1','2');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-20
          • 2011-08-21
          • 1970-01-01
          相关资源
          最近更新 更多