mysql和php数组的混合
我有一张这样的桌子mysql和php数组的混合,php,mysql,arrays,Php,Mysql,Arrays,我有一张这样的桌子 id | type | number 1 | c | 2 2 | c | 10 3 | c | 20 ( SELECT * FROM table WHERE number >= $array[ type ] ) 我还得到了带有值的PHP数组: $array[c] = 5; $array[d] = 10; 我想做这样的事 id | type | number 1 | c | 2 2 | c | 10 3 | c
id | type | number
1 | c | 2
2 | c | 10
3 | c | 20
( SELECT * FROM table WHERE number >= $array[ type ] )
我还得到了带有值的PHP数组:
$array[c] = 5;
$array[d] = 10;
我想做这样的事
id | type | number
1 | c | 2
2 | c | 10
3 | c | 20
( SELECT * FROM table WHERE number >= $array[ type ] )
因此,类型可以以某种方式从mysql列中获取,并用于从数组中查找正确的值
这有点棘手,但我不确定我能问得多好。试试这个:
$type = 'c';
$query = "SELECT * FROM table WHERE number >= " . intval( $array[ $type ] ) . " AND type = '" . $type . "'";
试试这个:
$type = 'c';
$query = "SELECT * FROM table WHERE number >= " . intval( $array[ $type ] ) . " AND type = '" . $type . "'";
尝试分两步进行:
在使用sql查询将类型为的值放入数组之前
然后过一会儿
( SELECT * FROM table WHERE number >= $array[$i] )
其中$i是while循环的索引请尝试分两步执行:
在使用sql查询将类型为的值放入数组之前
然后过一会儿
( SELECT * FROM table WHERE number >= $array[$i] )
其中$i是while循环的索引这不是最优雅的方式,而是类似的方式
$where = "WHERE ";
foreach($array as $key => $value)
{
$where .= "(type = $key AND number >= $value) OR";
}
$where = substr($where, 0, strlen($where)-2);
您必须将其附加到select语句中,然后运行查询
希望这能让其他人理解并提供更优雅的解决方案。这不是最优雅的方式,而是类似的方式
$where = "WHERE ";
foreach($array as $key => $value)
{
$where .= "(type = $key AND number >= $value) OR";
}
$where = substr($where, 0, strlen($where)-2);
您必须将其附加到select语句中,然后运行查询
希望这能让其他人理解并提供更优雅的解决方案。可能比使用大量WHERE子句要好一点,如下所示:-
SELECT *
FROM table a
INNER JOIN
(SELECT 'c' AS RowType, 5 AS RowVal
UNION
SELECT 'd', 10) Sub1
ON a.type = Sub1.type AND a.number >= Sub1.RowVal
<?php
$SubQuery = array();
foreach ($array AS $key=>$value)
{
$SubQuery[] = "SELECT '$key' AS RowType, $value AS RowVal";
}
$sql = "SELECT *
FROM table a
INNER JOIN (".implode(" UNION ", $SubQuery).") Sub1
ON a.type = Sub1.type AND a.number >= Sub1.RowVal";
?>
设置一个仅获取常量的子选择,然后在该子选择和现有表之间进行连接
在php中,您可以执行以下操作:-
SELECT *
FROM table a
INNER JOIN
(SELECT 'c' AS RowType, 5 AS RowVal
UNION
SELECT 'd', 10) Sub1
ON a.type = Sub1.type AND a.number >= Sub1.RowVal
<?php
$SubQuery = array();
foreach ($array AS $key=>$value)
{
$SubQuery[] = "SELECT '$key' AS RowType, $value AS RowVal";
}
$sql = "SELECT *
FROM table a
INNER JOIN (".implode(" UNION ", $SubQuery).") Sub1
ON a.type = Sub1.type AND a.number >= Sub1.RowVal";
?>
可能比使用大量WHERE子句要好一些,如下所示:-
SELECT *
FROM table a
INNER JOIN
(SELECT 'c' AS RowType, 5 AS RowVal
UNION
SELECT 'd', 10) Sub1
ON a.type = Sub1.type AND a.number >= Sub1.RowVal
<?php
$SubQuery = array();
foreach ($array AS $key=>$value)
{
$SubQuery[] = "SELECT '$key' AS RowType, $value AS RowVal";
}
$sql = "SELECT *
FROM table a
INNER JOIN (".implode(" UNION ", $SubQuery).") Sub1
ON a.type = Sub1.type AND a.number >= Sub1.RowVal";
?>
设置一个仅获取常量的子选择,然后在该子选择和现有表之间进行连接
在php中,您可以执行以下操作:-
SELECT *
FROM table a
INNER JOIN
(SELECT 'c' AS RowType, 5 AS RowVal
UNION
SELECT 'd', 10) Sub1
ON a.type = Sub1.type AND a.number >= Sub1.RowVal
<?php
$SubQuery = array();
foreach ($array AS $key=>$value)
{
$SubQuery[] = "SELECT '$key' AS RowType, $value AS RowVal";
}
$sql = "SELECT *
FROM table a
INNER JOIN (".implode(" UNION ", $SubQuery).") Sub1
ON a.type = Sub1.type AND a.number >= Sub1.RowVal";
?>
既然$array[c]
是一个整数,那么究竟是什么阻止您将其用作参数?其中type=c,number>=5
用于$array[c]=5
你的意思是?@YourCommonSense这也是我所能理解的。我想他的意思是,对于数组中的所有整数,根据键得到相应的值,这是数据库中类型字段中的值。。。所以,如果type=c,number>5,如果type为d,number>10,但他需要在一个语句中完成这一切。我能看到的唯一方法是使用PHP生成一个包含大量ORs的大型WHERE子句。这有点奇怪:WHERE(type=c和number>5)或(type=d和number>10)
Mathew是对的,我不能用WHERE-type=c和number>=5,因为我有6种类型和数字,从1到50,我想从数据库中获取更少的mysql行。因为$array[c]
是一个整数,究竟是什么阻止您将其用作参数?其中type=c,number>=5
用于$array[c]=5
你的意思是?@YourCommonSense这也是我所能理解的。我想他的意思是,对于数组中的所有整数,根据键得到相应的值,这是数据库中类型字段中的值。。。所以,如果type=c,number>5,如果type为d,number>10,但他需要在一个语句中完成这一切。我能看到的唯一方法是使用PHP生成一个包含大量ORs的大型WHERE子句。这有点奇怪:WHERE(type=c和number>5)或(type=d和number>10)
Mathew是对的,我不能使用WHERE-type=c和number>=5,因为我有6种类型和1到50的数字,我想从数据库中获取较少的mysql行。如果我获取了多个类型,我该怎么办?实际上,我从mysql中获取了6种类型。如果我获取了多个类型,该怎么办?事实上,我从mysql中获取了6种类型。我测试了这一种,它可以正常工作。也很简单。我想这个答案最能回答我的问题;]尽管如此,我没有测试kickstart的答案,因为它更长。两者都可以完成任务。此解决方案可能会提供更易于一目了然阅读的SQL。我的解决方案避免了重复的ORs,如果检查数量过大,可以很容易地更改为使用临时表,而不是选择值进行连接。如果我使用这个解决方案,我会尝试将每个检查放入一个数组中,然后对数组进行内爆以创建WHERE(就像我在解决方案中所做的那样),但主要是因为我有点不喜欢建立一个字符串,然后切掉多余的或。如果使用了substr,则无需使用strlen,substr接受一个负的第三个参数。我同意@Kickstart,我的方法不是一个非常实用的方法,因为它会创建大量的SQL字符串或粘在一起的语句。这是我通常会避免的,但我会像这样打出来,以帮助其他人理解这个问题。我测试了这个,它工作了。也很简单。我想这个答案最能回答我的问题;]尽管如此,我没有测试kickstart的答案,因为它更长。两者都可以完成任务。此解决方案可能会提供更易于一目了然阅读的SQL。我的解决方案避免了重复的ORs,如果检查数量过大,可以很容易地更改为使用临时表,而不是选择值进行连接。如果我使用这个解决方案,我会尝试将每个检查放入一个数组中,然后对数组进行内爆以创建WHERE(就像我在解决方案中所做的那样),但主要是因为我有点不喜欢建立一个字符串,然后切掉多余的或。如果使用了substr,则无需使用strlen,substr接受一个负的第三个参数。我同意@Kickstart,我的方法不是一个非常实用的方法,因为它会创建大量的SQL字符串或粘在一起的语句。这是我通常会避免的,但我会这样打出来,以帮助其他人理解这个问题。