select 从多对多 table 获取所有数据的最有效方法是什么?
What is the most effective way to select all data from many-to-many table?
我在下面设计了多对多table:
activity
----------
id
name
activity_student
----------
id
activity_id
student_id
student
----------
id
name
每个学生可以参加很多活动,每个活动可以有很多参与者。
我想从activityselect,同时,我想收集参与者作为数组。
我要制作的最终数据是这样的:
[
id => 1,
name => football club activity,
participants =>
[
[
id => 1,
name => example student,
class => 3
],
[
id => 3,
name => example student2,
class => 5
]
]
]
我尝试 select activity.* 和 group_concat student_id。然后我使用 foreach 语句检索学生的数据。
但我认为这不是最佳实践,因为查询时间超过 10 秒,超过 10,000 行。
最佳做法是什么?
- 我正在使用 CI4,mysql 数据库和 InnoDB 引擎。
在 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 ...
你会得到一个类似于 table 的结构,其中包含 ActivityName、StudentName 等。在 WHERE
中,你可以过滤到一个 activity 或其他任何内容。
关于映射的高效模式的提示:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table
我在下面设计了多对多table:
activity
----------
id
name
activity_student
----------
id
activity_id
student_id
student
----------
id
name
每个学生可以参加很多活动,每个活动可以有很多参与者。
我想从activityselect,同时,我想收集参与者作为数组。
我要制作的最终数据是这样的:
[
id => 1,
name => football club activity,
participants =>
[
[
id => 1,
name => example student,
class => 3
],
[
id => 3,
name => example student2,
class => 5
]
]
]
我尝试 select activity.* 和 group_concat student_id。然后我使用 foreach 语句检索学生的数据。
但我认为这不是最佳实践,因为查询时间超过 10 秒,超过 10,000 行。
最佳做法是什么?
- 我正在使用 CI4,mysql 数据库和 InnoDB 引擎。
在 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 ...
你会得到一个类似于 table 的结构,其中包含 ActivityName、StudentName 等。在 WHERE
中,你可以过滤到一个 activity 或其他任何内容。
关于映射的高效模式的提示:http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table