【问题标题】:cast text field to array in mysql select query在mysql选择查询中将文本字段转换为数组
【发布时间】:2012-01-11 16:59:37
【问题描述】:

我在 MySQL 数据库中有一个表。在该表中有一个名为“选择”的文本字段,其中包含编号值,由管道字符分隔(例如:44|5|23|546|.....)。我还有一个php数组:$values = array(63,35,7,5);

我需要将“选择”字段称为选项数组(由“|”分隔)并仅选择至少包含 $values 数组中数字之一的行。

我希望我能准确地解释我的问题,因为我的英语很差...谢谢。

【问题讨论】:

  • 我认为实际的问题是数据库设计没有将关系元素存储为不同的数据片段。为什么不将该管道分隔的字段拆分为单独的表?查询它会变得容易得多,因为 SQL 旨在查询关系表。
  • 问题是一个字段通常只包含一个值。不是多个值。如果您需要在一个字段上有多个值,则应该有一个具有关系(多对多关系)的表。更多详情请看这里:tomjewett.com/dbdesign/dbdesign.php?page=manymany.php
  • 这是一个强项,如果我不能为此提供更简单的解决方案,我会改变这个逻辑。更改数据库的结构会花费我很多时间,而且我有点懒。

标签: php mysql arrays select


【解决方案1】:

如果要获取$values 数组中至少包含一个数字的行,SQL 如下所示:

$values = array(63,35,7,5);

foreach ($values as $value) {

     $sql = "select * from tablename where selection like '%{$value}|%' or '%|{$value}%'";

}

【讨论】:

  • 当搜索“2”并且该字段中有 12|13 时,这将失败。对于这种糟糕的设计,您需要 4 个案例。 1)直接相等(一个值),开始值($v|%),结束值(%|$v)和中间值(%|$v|%)。
  • @MarcB - 如果您可以将其添加到单独的答案中,我可以将其标记为已接受。谢谢!
【解决方案2】:

如果数组中的值已经按照适当的顺序进行搜索,您可以使用以下内容构建查询:

$selection_searched = implode('|', $values);
$query = "SELECT * FROM your_table WHERE selection = '$selection_searched'";

请注意,您可能需要先验证数组 $values,以检查它是否为空等。请查看以下手册:http://php.net/implode

【讨论】:

  • 不起作用:SELECT '4|3|5|' = '4|5|3|' 字段中的值未以任何特定方式排序
  • 那么也许你应该改变你的模型,把字段放在另一个表中。
猜你喜欢
  • 1970-01-01
  • 2011-08-23
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
相关资源
最近更新 更多