如果我想选择包含一个recipeid
的所有tagsid
,例如:
tagsid = 1
recipeid = 2|12|1|8
如果我使用此代码:
$query = "SELECT * FROM recipe where tagsid like '%".$tag_id."%'";
它会在recipeid
1
中显示tagsid
12, 1
,但它应该只在tagsid 1
中。为什么这不正确?
答案 0 :(得分:0)
您应该在tag_id
之间找到|
的匹配项,或者如果值从此tag_id
开始,后面只有一个|
。我想你|
之后总是tag_id
。
$query =
"SELECT *
FROM recipe
where tagsid like '%|".$tag_id."|%'" or
tagsid like '".$tag_id."|%'";
应考虑两种情况:
%|<tag_id>|%
- 不在第一个地方
<tag_id>|%
- 首先是
它会在tagsid 12,1中显示recipeid 1,但它应该只在tagsid 1中显示。为什么这不正确?
因为%
符号用作通配符,表示任意数量的任何符号。您搜索%1%
模式。具有至少一个1
子字符串的所有字符串都匹配该模式。 12|
也是如此。
答案 1 :(得分:0)
使用分隔符,后面有分隔符,但之前没有任何内容,或之前有分隔符,但之后没有任何内容
$query = "SELECT * FROM recipe WHERE tagsid LIKE '%|".$tag_id."|%' OR tagsid LIKE '".$tag_id."|%' OR tagsid LIKE '%|".$tag_id."'";
答案 2 :(得分:0)
用逗号替换管道后,在FIND_IN_SET()
列上使用tagsid
。
$query = "SELECT *
FROM recipe
WHERE COALESCE(FIND_IN_SET($tag_id, REPLACE(tagsid, '|', ',')), 0) > 0"
顺便说一下,您应该避免在列中存储CSV,因为它很难使用。