1

首先我想说,如果这个问题已经被问过(当时还没有找到),我很抱歉。

我的问题是我LIKE在 mysql 中有一个子句,我必须在逗号分隔的行中找到一些数字。(是的,我知道逗号分隔的行不是一个好东西,但我不是创建数据库结构的人)。

所以我有以下内容:

  SELECT pfd.*, pu.username, pu.user_email 
  FROM phpbb_profile_fields_data pfd
  LEFT JOIN phpbb_users pu ON pfd.user_id=pu.user_id 
  WHERE pfd.pf_pf_produktionsteknik LIKE '%" . ($id) . "%' 
      AND pu.user_type!=1 AND pfd.pf_status=2";

但问题出在它返回LIKE相等的地方1(应该)但也11(不应该)。

我尝试过使用field_in_set无法上班的东西,现在我不知道该怎么办了。

4

4 回答 4

1

如果您的列表是逗号分隔的,您是否可以先查找数字,然后是逗号,或者是逗号,然后是数字,或者单独查找等于数字。这应该涵盖所有情况,包括单个数字实例。

于 2012-11-06T15:22:47.607 回答
1

搜索的值可以用逗号括起来,或者在位于列表开头时跟在逗号后面,或者在位于列表末尾时跟在逗号后面,或者它是唯一的值(列表中没有逗号)

WHERE (pfd.pf_pf_produktionsteknik LIKE '%," . ($id) . ",%' 
    OR pfd.pf_pf_produktionsteknik LIKE '"($id) . ",%'    
    OR pfd.pf_pf_produktionsteknik LIKE '%," .($id) . "'    
    OR pfd.pf_pf_produktionsteknik = '" .($id) . "'    )  AND ...
于 2012-11-06T15:43:41.227 回答
0

您正在处理结构不良的数据,因此您需要解决这个问题——逗号分隔的数字集不在 1nf 中,这是非常基本的。

现在我已经解决了这个问题,您可以尝试使用正则表达式而不是 LIKE:

作为 SQL(注意 value 1):

WHERE pfd.pf_pf_produktionsteknik REGEXP '\b1\b'

或作为 PHP 字符串:

..." WHERE pfd.pf_pf_produktionsteknik REGEXP '\b" . $id . "\b'"

...将匹配 1 但不匹配 11:\b是“单词边界”的正则表达式,这意味着它需要在 value 的任一侧以字符串或标点符号或空格开头$id

于 2012-11-06T15:27:08.193 回答
0

手动find_in_set)mysql 函数是您要查找的:它在逗号分隔值内搜索值。

select find_in_set('1', 'a,b,1,c');

给出这个:

+-----------------------------+
| find_in_set('1', 'a,b,1,c') |
+-----------------------------+
|                           3 |
+-----------------------------+
1 row in set (1.10 sec)

如果函数失败,则返回 0。

在你的情况下,做WHERE find_in_set('1', pfd.pf_pf_produktionsteknik) > 0会给你你所需要的。

于 2012-11-06T15:35:28.273 回答