0

我正在尝试在数据库中查找 id。我需要找到以下内容:

17,
,17
,17,

确保不要找到以 17 开头的任何其他 ID(即 170、171、173 等)。目前我已经设置了以下变量来拉入 mysql 查询:

$userid = '' . $row['userid'] . ',%';
$userid2 = '%,' . $row['userid'] . '%';
$userid3 = '' . $row['userid'] . '%';

但是我发现我也在拉入 id 170。我认为只要将 id 170 放在字符串的末尾就会发生这种情况。您能提供的任何帮助我将不胜感激。这是我正在使用的查询:

"SELECT formid, draft, activestatus 
 FROM forms
 WHERE notifyusers like '$userid' 
 AND activestatus != '3' OR notifyusers like '$userid2' AND activestatus != '3' 
 OR notifyusers like '$userid3' AND activestatus != '3'";   
4

6 回答 6

3

您可以使用FIND_IN_SET函数,如下所示:

SELECT formid, draft, activestatus 
FROM forms
WHERE
  (FIND_IN_SET('17', notifyusers)>0 AND activestatus != '3')
  OR ...

或者你可以这样使用 LIKE :

WHERE
  CONCAT(',', notifyusers, ',') LIKE ('%,17,%')
于 2013-07-31T15:23:44.240 回答
1

您的 notifyusers 列包含 1->many 关系作为 CSV 数据?为什么不利用关系数据库真正擅长的东西呢?你知道的,关系!创建一个单独的表来存储 formid 和 userid 之间的链接:

CREATE TABLE form_notifyuser
(
   formid INT NOT NULL,
   userid INT NOT NULL,
   PRIMARY KEY(formid, user_id),
   INDEX(user_id)
);

现在您的查询更容易表达和阅读!

SELECT forms.formid, forms.draft, forms.activestatus 
 FROM forms
 INNER JOIN form_notifyuser USING(formid)
 WHERE form_notifyuser.userid = 17 AND  forms.activestatus != 3;
于 2013-07-31T15:28:46.403 回答
0

确保notifyusers看起来像这样:

,1,2,7,9,70,

注意尾随和前导,。要生成它,请执行以下操作:

$value = "," . implode(",", $ids) . ",";

这允许像这样的过滤器:

WHERE `notifyusers` LIKE '%,7,%'

总是工作,即使7在最后

于 2013-07-31T15:19:58.047 回答
0

似乎很奇怪,您的 id 值中带有逗号。对我来说,这听起来像问题会先解决。话虽如此,使用通配符匹配LIKE('17%')永远无法区分17,170(甚至1700000就此而言),因为它不关心通配符位置的值是什么。REGEXP如果您需要查找除逗号之外的多个不同字符但需要具体说明接受的值,则需要使用来执行这种特定匹配。

要么,或者您可以专门使用逗号而不是%搜索“notifyusers = '17”,或 notifyusers = ',17,'或 notifyusers = ',17'。

于 2013-07-31T15:21:03.130 回答
0
$userid =         $row['userid'] . ',%';
$userid2 = '%,' . $row['userid'] . ',%';
$userid3 = '%,' . $row['userid']       ;
于 2013-07-31T15:22:50.523 回答
0

试试这个查询:

"SELECT formid, draft, activestatus 
 FROM forms
 WHERE concat(',',notifyusers,',') like '%,".$row['userid'].",%' 
 AND activestatus != '3'";
于 2013-07-31T17:00:33.977 回答