php - MySQL( explode/匹配数组)

标签 php mysql arrays explode

问题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 )。但是……

参见 FIND_IN_SET()

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/

相关文章:

php - $.ajax方法提交表单时如何使用$_POST方法获取数据

php - 如何在mysql查询中组合多个下拉列表值?

PHP file_exists() 函数在/usr/bin/mysql 上返回 false

php - MySQL 为考勤案例选择行

mysql - 无法在 MYSQL 存储过程中运行 exec 命令

Java:迭代多维数组概念

php - Paypal + PHP : how to receive a value on success sale

mysql - 在简单的库存数据库中包含什么

php - 以特定间隔合并数组

c - 用c语言查找数组的所有子集以及各个子集到不同数组的总和