这是'哦,我的上帝'时刻之一。
我们公司的前任程序员使用PHP和MySQL留下了编码错误的应用程序。
一个例子是他在MySQL中将每个客户的选项存储为逗号分隔值。整个应用程序基于 NOT OOP,因此在500多页PHP的几乎每一页中都有重复的引用和查询。因此,现在更改架构和数据存储逻辑并非易事。
要调整系统六个月,我正在寻找一种方法来搜索这些逗号分隔值。是否有人对在不影响性能的情况下搜索此类CSV有任何想法?我知道它不会是最好的,但至少我可以在新应用程序准备就绪之前将应用程序再推迟六个月。
感谢您的帮助
答案 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,%"
我无法谈论对性能的影响 - 它可能不会令人愉快,但我认为你的另一个选择就是将这一行分成一个单独的表格,但你说这对你来说并不现实。