有效的PHP数组和选择
我可以用几个foreach语句来解决这个问题,但是当每个班级有26名学生,并且一些科目有13个“radnumer”时,加载页面需要花费很长时间。见下面的例子 这是我希望输出的行和列: 问题是:加载需要花费很长时间 问题:我如何加快速度并提高效率 表1我选择了一个班级的所有学生,选择1:有效的PHP数组和选择,php,mysql,sql,arrays,Php,Mysql,Sql,Arrays,我可以用几个foreach语句来解决这个问题,但是当每个班级有26名学生,并且一些科目有13个“radnumer”时,加载页面需要花费很长时间。见下面的例子 这是我希望输出的行和列: 问题是:加载需要花费很长时间 问题:我如何加快速度并提高效率 表1我选择了一个班级的所有学生,选择1: SELECT `intressenter_alla`.id, `intressenter_alla`.fornamn, `intressenter_alla`.efternamn FROM `intressen
SELECT `intressenter_alla`.id, `intressenter_alla`.fornamn, `intressenter_alla`.efternamn
FROM `intressenter_alla`
INNER JOIN `klass_elev`
ON `intressenter_alla`.id = `klass_elev`.id
WHERE (`klass_elev`.klass = :klassen)
ORDER BY `intressenter_alla`.efternamn, `intressenter_alla`.fornamn ASC
打印时提供:
Array (
[0] => Array (
[id] => 1226
[0] => 1226
[lid] => 0
[1] => 0
[fornamn] => Peter
[2] => Peter
[efternamn] => Strobe
[3] => Strobe
[personnr] => 070920-8690
[4] => 070920-8690
[mejl] => peter.strobe@mail.com
[5] => peter.strobe@mail.com
[6] => 1226
[klass] => 6B
[7] => 6B
)
[1] => Array (
[id] => 1227
[0] => 1227
[lid] => 0
[1] => 0
[fornamn] => Victor
[2] => Victor
[efternamn] =>Gand
[3] => Gand
[personnr] => 070518-8995
[4] => 070518-8995
[mejl] => victor.gand@mail.com
[5] => victor.gand@mail.com
[6] => 1227
[klass] => 6B
[7] => 6B
)
)
Array (
[kunsk_id] => 138557
[0] => 138557
[amne_id] => 1
[1] => 1
[radnummer] => 5
[2] => 5
[elev_id] => 1226
[3] => 1226
[arskurs] => 5
[4] => 5
[lid] => 1
[5] => 1
[kunsk_klick] => E
[6] => E
[datum] => 2018-05-29
[7] => 2018-05-29
)
Array (
[kunsk_id] => 138561
[0] => 138561
[amne_id] => 1
[1] => 1
[radnummer] => 5
[2] => 5
[elev_id] => 1227
[3] => 1227
[arskurs] => 5
[4] => 5
[lid] => 1
[5] => 1
[kunsk_klick] => E
[6] => E
[datum] => 2018-05-29
[7] => 2018-05-29
)
表2,我为每个学生选择了相应的数据。
这里有一个问题。在这个例子中,每个学生都应该有五行“radnummer”se,用于下面这个特定的主题。只有最后一个出现了。每一行上都应该显示一个特定的值“kunsk_klick”。请参见下面的示例选择2:
SELECT *
FROM `iup_kunskapskrav_klick`
WHERE elev_id = ? AND radnummer = ? AND amne_id = ? AND arskurs = ?
ORDER BY radnummer, datum DESC
打印时提供:
Array (
[0] => Array (
[id] => 1226
[0] => 1226
[lid] => 0
[1] => 0
[fornamn] => Peter
[2] => Peter
[efternamn] => Strobe
[3] => Strobe
[personnr] => 070920-8690
[4] => 070920-8690
[mejl] => peter.strobe@mail.com
[5] => peter.strobe@mail.com
[6] => 1226
[klass] => 6B
[7] => 6B
)
[1] => Array (
[id] => 1227
[0] => 1227
[lid] => 0
[1] => 0
[fornamn] => Victor
[2] => Victor
[efternamn] =>Gand
[3] => Gand
[personnr] => 070518-8995
[4] => 070518-8995
[mejl] => victor.gand@mail.com
[5] => victor.gand@mail.com
[6] => 1227
[klass] => 6B
[7] => 6B
)
)
Array (
[kunsk_id] => 138557
[0] => 138557
[amne_id] => 1
[1] => 1
[radnummer] => 5
[2] => 5
[elev_id] => 1226
[3] => 1226
[arskurs] => 5
[4] => 5
[lid] => 1
[5] => 1
[kunsk_klick] => E
[6] => E
[datum] => 2018-05-29
[7] => 2018-05-29
)
Array (
[kunsk_id] => 138561
[0] => 138561
[amne_id] => 1
[1] => 1
[radnummer] => 5
[2] => 5
[elev_id] => 1227
[3] => 1227
[arskurs] => 5
[4] => 5
[lid] => 1
[5] => 1
[kunsk_klick] => E
[6] => E
[datum] => 2018-05-29
[7] => 2018-05-29
)
编辑1:表的结构
表INTRESENTER_alla
表iup_kunskapskrav_klick
表klass_elev
编辑2:我知道的示例代码,PHP和HTML混合不好,缩进也不好
从回应来看,这一评论似乎是一个有效的解决方案:
您的MySQL架构表似乎都没有索引
所以。。。向SQL表添加索引。理想情况下,您应该索引在任何WHERE子句、任何JOIN子句或任何ORDERBY中引用的所有列。索引是提高MySQL速度的关键
注意:此处列出的建议是微观优化,对页面加载时间和/或效率的影响最小。这些只是一些调整,它们的改进与通过在MySQL中实现适当的列索引所获得的改进相比将显得微不足道,如上所述
使用switch-PHP语句而不是重复的elseif
变成
switch($iup_info['kunsk_klick']) {
case "F":
$betyget = 'O';
break;
case "E":
$betyget = '1';
break;
case "C":
$betyget = '2';
break;
case "A":
$betyget = '3';
break;
case "":
$betyget = 'P';
break;
}
对于列定义,请使用正确的。许多只有3、4或5列长度的INT列可以是无符号的SMALLINT
统一MySQL列数据类型,以便INT4列与JOIN和WHERE子句中的其他INT4列进行比较。
使用utf8mb4字符集和排序规则,而不是蹩脚的3字节UTF-8
if语句中的类型转换效率:int$arskursen===6比$arskursen==6更快、效率更高
将PHP修改为只输出命名列数据,而不输出正在使用PHP中所需数据两倍的数字标记数据。例如:
Array (
[kunsk_id] => 138561
[amne_id] => 1
[radnummer] => 5
[elev_id] => 1227
[arskurs] => 5
[lid] => 1
[kunsk_klick] => E
[datum] => 2018-05-29
)
你能告诉我们你的实际代码而不仅仅是查询吗?我猜在循环中有查询?另外,您是否确保表已正确索引?这将大大加快查询速度。如果不知道数据库模式,很难理解这个问题。请您将数据库复制到SQL Fiddle?…或者更好,在此处添加模式,以便将来的访问者也可以看到它。@MagnusEriksson实际代码非常广泛。是否可以显示它的部分内容?到目前为止非常感谢。1 errrm,您的MySQL模式表似乎都没有索引……只是出于好奇,您在OP下的评论中提到的使用switch/case over if/else的效率提高有什么参考吗?在本例中,没有双关语,使用switch/case确实会使代码更具可读性,但我所读到的关于这个主题的所有内容基本上都是以没有实际性能差异的结论结束的。@MagnusEriksson switch只读取变量的值一次,并根据每种情况进行检查。手动在switch语句中声明,只对条件求值一次,并将结果与每个case语句进行比较。在elseif语句中,再次计算条件。因此,开关的效率会稍微高一点。但我必须声明,除了MySQL索引之外,我所有的观点都将是微小的改进-当然,但我严重怀疑,仅仅读取一个变量一次或50次,是否会产生任何明显的差异。似乎是所有微观优化之母:但如果你能在每一个上都有一个函数,那就有点不同了。“那么可能会有很大的不同。”马格努里克森我在回答中添加了一个不合格项,above@Per76使用类似以下内容:
Array (
[kunsk_id] => 138561
[amne_id] => 1
[radnummer] => 5
[elev_id] => 1227
[arskurs] => 5
[lid] => 1
[kunsk_klick] => E
[datum] => 2018-05-29
)
if ($iup_info['kunsk_klick'] == "F"){$betyget = 'O';}
elseif ($iup_info['kunsk_klick'] == "E"){$betyget = '1';}
elseif ($iup_info['kunsk_klick'] == "C"){$betyget = '2';}
elseif ($iup_info['kunsk_klick'] == "A"){$betyget = '3';}
elseif (empty($iup_info['kunsk_klick'])) {$betyget = "P"; }
switch($iup_info['kunsk_klick']) {
case "F":
$betyget = 'O';
break;
case "E":
$betyget = '1';
break;
case "C":
$betyget = '2';
break;
case "A":
$betyget = '3';
break;
case "":
$betyget = 'P';
break;
}
Array (
[kunsk_id] => 138561
[amne_id] => 1
[radnummer] => 5
[elev_id] => 1227
[arskurs] => 5
[lid] => 1
[kunsk_klick] => E
[datum] => 2018-05-29
)