SQL从同一行

时间:2016-03-23 23:34:10

标签: php sql

如果我想选择包含一个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中。为什么这不正确?

3 个答案:

答案 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,因为它很难使用。