我正在尝试将数组排序为三深数组。这是我目前的查询:
SELECT * FROM question
INNER JOIN category ON question.category_id = category.id
INNER JOIN difficulty ON question.difficulty_id = difficulty.id
预期结果如下:
array(
'1' => array( // category id 1
'1' => array( // difficulty id 1
'1' => array('...'), // question id 1
'2' => array('...') // question id 2
),
'2' => array(
'3' => array('...'),
'4' => array('...')
)
)
)
我确实有以下内容:
foreach($categories as $category) {
foreach($difficulties as $difficulty) {
foreach($questions as $question) {
if ($question['category_id'] == $category['id'] && $question['difficulty_id'] == $difficulty['id']) {
$feed[$category['id']][$difficulty['id']][$question['id']] = $question;
}
}
}
}
但是会有10,000多个问题并且性能会很差,所以有没有办法用一个查询和更少的循环来做到这一点?
答案 0 :(得分:2)
基本上你可以像这样返回你的查询和顺序 ids:
Category_ID Difficulty_ID Question_ID
0 0 0
0 0 1
1 0 2
1 3 3
1 3 4
2 0 5
2 1 6
然后解析所有内容:
像这样加载每个表的每一行:
key: unique table prefix + id
value: columns (delimited with the delimiter defined before)
一次返回整个表的最简单方法是定义第二个分隔符,然后以下列形式进行一些稍微丑陋的查询:
SELECT id||delimiter||col1||delimiter||...||colN FROM ...
然后使用第二个分隔符(mysql中的group_concat()
)将所有内容与列表聚合放在一起。
有时您需要地图(对于N到M的关系,或者如果您想按难度或类别搜索问题),但因为每个问题只有一个类别和难度,您已经完成了。
< / LI> 醇>如果数据不是太大而且在登录后没有变化,那么你可以使用应用程序缓存并在脚本标签中回显你的东西。