首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL (爆炸/匹配阵列)

MySQL (爆炸/匹配阵列)
EN

Stack Overflow用户
提问于 2010-07-31 07:49:46
回答 6查看 5.6K关注 0票数 4

Question1:

MySQL表

id _x数组

1-1-1-2-3

2-2-2

3. 2,3

4.4-4 5-6

代码语言:javascript
复制
$_GET['id'] = 2;
$a = mysql_query("SELECT * FROM `table` WHERE `array` ??? '$_GET[id]'");

在这个步骤中,我希望运行整个数组,看看它是否与$_GET‘it’匹配,因此它应该输出:

编号: 1,2,3

Question2:

MySQL表

id _x数组

1. 4,5,6

2. 3,4,7

代码语言:javascript
复制
$_GET['id'] = 4;
$a = mysql_query("SELECT * FROM `table` WHERE `array` ??? '$_GET[id]'");

在这个步骤中,我只想要匹配数组中的第一个元素,因此它应该输出:

id: 4

我只能考虑使用PHP来完成这个任务,但如果可能的话,我宁愿只在MySQL查询中完成所有这些操作。

代码语言:javascript
复制
$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 />';
        }
    }
}

代码语言:javascript
复制
$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 />';
    }
}

那看起来太糟糕了。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-31 08:00:23

数据库中的数据结构对于查询您想要的方式并不是最理想的。

关于第一个问题:

代码语言:javascript
复制
mysql_query("SELECT * FROM table WHERE array LIKE '%,$_GET[id],%' OR array LIKE '$_GET[id],%' OR array LIKE '%,$_GET[id]' OR array = '$_GET[id]'");

第二阶段:

代码语言:javascript
复制
mysql_query("SELECT id, SUBSTR(array, 1, POSITION(',' IN array) - 1) AS array FROM table WHERE array LIKE '$_GET[id],%' OR array = '$_GET[id]'");

正如您所看到的,这些查询不是很漂亮,但是它们可以做您想做的事情。

票数 2
EN

Stack Overflow用户

发布于 2010-07-31 08:50:47

您可以/应该以不同的结构构造您的数据库,这一点已经提到过(请参阅归一化)。但是...

请参阅SET()

mysql>选择FIND_IN_SET('b','a,b,c,d'); -> 2

例如:

代码语言:javascript
复制
<?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;
}

版画

代码语言:javascript
复制
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无法使用索引执行此搜索,即在全表扫描中的查询结果,请参阅使用EXPLAIN优化查询

编辑:

对于第二个问题,您只需将WHERE-子句更改为

WHERE FIND_IN_SET('$sql_x', foo)=1

票数 4
EN

Stack Overflow用户

发布于 2010-07-31 08:01:57

未经测试,但您应该能够使用:

问题1:

代码语言:javascript
复制
SELECT * FROM table WHERE array REGEXP '(^|,)?(,|$)';
// Match either the start of the string, or a , then the query value, then either a , or the end of the string

问题2:

代码语言:javascript
复制
SELECT * FROM table WHERE array REGEXP '^?(,|$)';
// Match the start of the string, then the query value, then either a , or the end of the string

?替换为您的$_GET值。不知道这是怎么回事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3377293

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档