我是新手。下面是一个mysql数据库中的表示例,我从中提取数据。
id classA classB value
------------------------------
1 A A 1
2 A B 5
3 A C 2
4 B A 1
5 B B 5
6 B C 1
7 C A 8
8 C B 5
9 C C 7
用户放入一个类别列表(a、b、c等),我的代码将返回这些对的每个组合的值(例如[a、a]、[a、b]、[a、c]。。。等等)。我可以很容易地实现这一点,使用下面的脚本 $array
是输入列表(例如[a,b,c]):
<?php
// Mehtod 1 - slow
for($i = 0; $i < count($arr); $i++){
for ($j = 0; $j < count($arr); $j++){
$sql = "SELECT value FROM data_table WHERE '$arr[$i]'=classA AND '$arr[$j]'=classB LIMIT 1";
$value = mysqli_query($con,$sql);
$value = mysqli_fetch_array($corr)[0];
$results[] = array('classA' => $arr[$i], 'classB' => $arr[$j], 'value' => $value);
}
}
?>
然而,这是相当缓慢的,因为 mysqli_query()
在for循环中。相反,我更喜欢在单个调用中执行查询。我试过以下方法,但运气不好。。
<?php
// Mehtod 2 - fast
for($i = 0; $i < count($arr); $i++){
for ($j = 0; $j < count($arr); $j++){
// make array of class combinations
$query_array[] = array('classA' => $arr[$i], 'classB' => $arr[$j]);
}
}
// get arrays of pairs to request
$match1 = array_column($query_array, 'classA');
$match2 = array_column($query_array, 'classB');
$sql = "SELECT classA, classB, value FROM data_table WHERE classA IN '$match1' AND classB IN '$match2'";
$results = mysqli_query($con,$sql);
$results = mysqli_fetch_array($results);
?>
我可以用一个请求来进行这样的查询吗?我有点卡住了。干杯。
2条答案
按热度按时间qoefvg9y1#
用户在中放置一个类别列表(a、b、c等)。
因此,您使用in运算符的方法是正确的,但是,您不能附加
$match1
以及$match2
直接在sql查询中,因为它们仍然是数组。您必须将它们转换为逗号分隔的字符串,并为每个字符串添加单引号,因为
classA
以及classB
是数据库表中的字符串列。代码:
更新:
你可以替换
具有
oipij1gg2#
因为您需要所有可能的组合,所以不需要在php中构建组合,然后在查询中使用它们。
我宁愿这样做:
这将考虑所有的组合。相当于:
在本例中,php代码如下所示:
最重要的是,为了避免与sql注入相关的攻击,应该使用prepared语句