问题1:
MySQL 表
编号 |数组
1 | 1,2,3
2 | 2
3 | 2,3
4 | 4,5,6
$_GET['id'] = 2;
$a = mysql_query("SELECT * FROM `table` WHERE `array` ??? '$_GET[id]'");
在这一步中,我想遍历整个数组并查看它是否与 $_GET['id'] 匹配,因此它应该输出:
编号:1,2,3
问题2:
MySQL 表
编号 |数组
1 | 4,5,6
2 | 3,4,7
$_GET['id'] = 4;
$a = mysql_query("SELECT * FROM `table` WHERE `array` ??? '$_GET[id]'");
在这一步中,我只想匹配数组中的第一个元素,所以它应该输出:
编号:4
我只能考虑使用 PHP 来执行此操作,但如果可能的话,我宁愿只在 MySQL 查询中执行所有这些操作。
$a = mysql_query("SELECT * FROM `table`");
while($b = mysql_fetch_assoc($a))
{
$elements = explode(',', $b['array']);
foreach($elements as $element)
{
if($element == $_GET['id'])
{
echo $b['id'].'<br />';
}
}
}
或
$a = mysql_query("SELECT * FROM `table`");
while($b = mysql_fetch_assoc($a))
{
$array = $b['array'];
if(in_array($_GET['id'], $array))
{
echo $b['id'].'<br />';
}
}
那看起来很糟糕。
最佳答案
您可以/应该以不同方式构建您的数据库已经被提及(参见 http://en.wikipedia.org/wiki/Database_normalization )。但是……
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2
例如
<?php
$mysql = init();
bar($mysql, 1);
bar($mysql, 2);
bar($mysql, 3);
bar($mysql, 4);
function bar($mysql, $x) {
$sql_x = mysql_real_escape_string($x, $mysql);
$result = mysql_query("SELECT id, foo FROM soTest WHERE FIND_IN_SET('$sql_x', foo)", $mysql) or die(mysql_error());
echo "$x:\n";
while( false!==($row=mysql_fetch_array($result, MYSQL_ASSOC)) ) {
echo $row['id'], ' ', $row['foo'], "\n";
}
echo "----\n";
}
function init() {
$mysql = mysql_connect('localhost', 'localonly', 'localonly') or die(mysql_error());
mysql_select_db('test', $mysql) or die(mysql_error());
mysql_query('CREATE TEMPORARY TABLE soTest (id int auto_increment, foo varchar(64), primary key(id))', $mysql) or die(__LINE__.' '.mysql_error());
mysql_query("INSERT INTO soTest (foo) VALUES ('1,2,3'), ('2,4'), ('3'), ('2,3'), ('1,2')", $mysql) or die(__LINE__.' '.mysql_error());
return $mysql;
}
打印
1:
1 1,2,3
5 1,2
----
2:
1 1,2,3
2 2,4
4 2,3
5 1,2
----
3:
1 1,2,3
3 3
4 2,3
----
4:
2 2,4
----
MySQL 无法使用索引来执行此搜索,即全表扫描中的查询结果,请参阅 Optimizing Queries with EXPLAIN
编辑:
对于第二个问题,您只需将 WHERE 子句更改为
WHERE FIND_IN_SET('$sql_x', foo)=1
关于php - MySQL( explode/匹配数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3377293/