我在下面設(shè)計(jì)了多對多表:activity----------idnameactivity_student----------idactivity_idstudent_idstudent----------idname每個(gè)學(xué)生可以參加很多活動,每個(gè)活動可以有很多參與者。我想從活動中選擇,同時(shí)我想將參與者收集為數(shù)組。我想要制作的最終數(shù)據(jù)如下:[ 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 語句檢索了學(xué)生的數(shù)據(jù)。但我認(rèn)為這不是最佳實(shí)踐,因?yàn)椴樵儠r(shí)間超過 10 秒,超過 10,000 行。最佳做法是什么?我正在使用 CI4,帶有 InnoDB 引擎的 mysql 數(shù)據(jù)庫。
1 回答
FFIVE
TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
在 SQL 中執(zhí)行復(fù)雜的任務(wù)幾乎總是比將大量數(shù)據(jù)拖回客戶端然后處理數(shù)據(jù)更有效。特別是在您要來回訪問數(shù)據(jù)庫的情況下。
閱讀有關(guān)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 ...
您會得到一個(gè)類似表格的結(jié)構(gòu),其中包含 ActivityName、StudentName 等。在其中WHERE您可以過濾到一個(gè)活動或其他任何內(nèi)容。
關(guān)于映射的有效模式的提示:http: //mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table
- 1 回答
- 0 關(guān)注
- 100 瀏覽
添加回答
舉報(bào)
0/150
提交
取消
