从逗号分隔值中搜索

时间:2010-01-01 04:02:56

标签: php mysql csv

这是'哦,我的上帝'时刻之一。

我们公司的前任程序员使用PHP和MySQL留下了编码错误的应用程序。

一个例子是他在MySQL中将每个客户的选项存储为逗号分隔值。整个应用程序基于 NOT OOP,因此在500多页PHP的几乎每一页中都有重复的引用和查询。因此,现在更改架构和数据存储逻辑并非易事。

要调整系统六个月,我正在寻找一种方法来搜索这些逗号分隔值。是否有人对在不影响性能的情况下搜索此类CSV有任何想法?我知道它不会是最好的,但至少我可以在新应用程序准备就绪之前将应用程序再推迟六个月。

感谢您的帮助

5 个答案:

答案 0 :(得分:4)

您可以使用FIND_IN_SET检索符合条件的行:

SELECT * FROM your_table WHERE FIND_IN_SET('value', field_with_comma_sep_values) > 0;

基本上,FIND_IN_SET返回找到的项目的索引。因此,此查询将查找在逗号分隔值的“set”中找到匹配单词的所有行。

信用:我知道有类似的东西,但this post是我找到答案和SELECT语句的地方。

答案 1 :(得分:2)

如何创建一个表,将CSV列作为批处理过程正确地分成多列(或多个记录),然后将旧表上的更新触发器拼凑在一起以刷新该用户的条目(或多个条目) ?然后,您可以在其上编写体面的查询,而无需重新编写setter逻辑。

答案 2 :(得分:1)

$a = '123,456,789';
$a_array = explode(",",trim($a));
if(in_array('456',$a_array))
{
  echo 'exist';
} else echo 'not exist';

答案 3 :(得分:0)

以下是在不更改架构或表示的情况下处理它的一个想法:

<?php
function checkoption ($user, $option)
{
    global $db;
    $rs = mysql_query ("select option_field_name from customer where user = '$user'", $db);
    if ($rs)
    {
         // enclose result in commas to remove edge cases for next test
         $opts = ",," . $rs ['option_field_name'] . ",";
         return strpos ($opts, ",$option,") != false;
    }
    return false;
}
?>

它在用户的字段中查找,option,,并通过使用额外的一对周围逗号处理所有引用来防范边缘情况。为了避免零与Null问题,在db字符串的前面添加了一个额外的逗号。

答案 4 :(得分:0)

所以你说你想要一个返回用户具有特定选项的所有行的查询?

嗯,呃......好吧,这不太好,但你已经知道了,所以:

select * from user_table
   where concat(',',option_field,',') like "%,option_you_want,%"

我无法谈论对性能的影响 - 它可能不会令人愉快,但我认为你的另一个选择就是将这一行分成一个单独的表格,但你说这对你来说并不现实。