-1

我在下面设计了多对多表:

activity
----------
id
name
activity_student
----------
id
activity_id
student_id
student
----------
id
name

每个学生可以参加很多活动,每个活动可以有很多参与者。

我想从活动中选择,同时我想将参与者收集为数组。

我想要制作的最终数据如下:

[
  id => 1,
  name => football club activity,
  participants =>
    [
      [
        id => 1,
        name => example student,
        class => 3
      ],
      [
        id => 3,
        name => example student2,
        class => 5
      ]
    ]
]

我尝试为 student_id 选择 activity.* 和 group_concat。然后我使用 foreach 语句检索了学生的数据。

但我认为这不是最佳实践,因为查询时间超过 10 秒,超过 10,000 行。

最佳做法是什么?

  • 我正在使用 CI4,带有 InnoDB 引擎的 mysql 数据库。
4

1 回答 1

1

在 SQL 中执行复杂的任务几乎总是比将大量数据拖回客户端然后处理数据更有效。特别是在您要来回访问数据库的情况下。

阅读有关JOIN.

SELECT  a.name AS ActivityName,
        s.name AS StudentName,
        ...
    FROM activity AS a
    JOIN activity_student AS map  USING(activity_id)
    JOIN student AS s  USING(student_id)
    WHERE ...

您会得到一个类似表格的结构,其中包含 ActivityName、StudentName 等。在其中WHERE您可以过滤到一个活动或其他任何内容。

关于映射的有效模式的提示:http: //mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

于 2020-01-07T16:49:19.003 回答