Mysql选择赞查询

时间:2018-10-28 07:18:47

标签: mysql sql sql-like

我是SQL的初学者。我想显示所有具有“ P1”的行,但是我的查询没有给出我想要的输出,我有一个名为“ tbl1”的表

tbl1

id          Name           Tag
8756        ADD            P2;P3;P10;P11;P12;P15
7861        Add1           P6;P4;P5;P2;P3;P1
7823        Place          P11;P12;P10;P8;P9;P6;P7;P4;P5;P2;P3
5567        Tun            P12;P10;P8;P9;P1;P6;
6789        lac            P3;

我的查询就是这样

SELECT id,name,tag FROM tbl1 WHERE tag LIKE '%P1%'

但是我的输出是这样

id          Name           Tag
8756        ADD            P2;P3;P10;P11;P12;P15
7861        Add1           P6;P4;P5;P2;P3;P1
7823        Place          P11;P12;P10;P8;P9;P6;P7;P4;P5;P2;P3
5567        Tun            P12;P10;P8;P9;P1;P6;

我想要的输出仅是那些拥有p1的人,而p1只能是这两个。有可能吗?

 id          Name           Tag
 7861        Add1           P6;P4;P5;P2;P3;P1
 5567        Tun            P12;P10;P8;P9;P1;P6;

5 个答案:

答案 0 :(得分:1)

  • 首先,在RDBMS中将多个值存储为以定界符分隔的字符串不是一个好习惯。您应该考虑normalizing您的数据。
  • 但是,在这种情况下,您可以利用Find_in_set()函数在逗号分隔的字符串中查找子字符串。
  • 但是,您可以使用分号分隔的字符串。因此,我们可以使用Replace()函数将所有逗号替换为分号,然后再使用Find_in_set()

请尝试以下操作:

SELECT id,name,tag 
FROM tbl1 
WHERE FIND_IN_SET(REPLACE(tag, ';', ','), 'P1') > 0

答案 1 :(得分:1)

由于您要查找包含P1的任何内容,因此您将获得所有其他记录,因为P10包含P1。当您的值用;分隔时,您可以检查类似%P1;%的值,或者检查P1是否是最后一个值%P1

SELECT id,name,tag FROM tbl1 WHERE tag LIKE '%P1;%' or tag like '%P1'

答案 2 :(得分:1)

在执行您提出的示例代码时,表的问题会出现P11和P1。

两个标签的“%P1%”相似。

我会在SQL语句中使用正则表达式。

对于您要解决的情况,将是:

WHERE column1 regexp 'P1$';
  • P1从字面上匹配字符P1(区分大小写)
  • $在行尾声明位置

答案 3 :(得分:0)

您可以使用OR运算符使用P1查询行:

SELECT id,name,tag FROM tbl1 WHERE (tag LIKE '%P1;%' or tag LIKE '%P1');

答案 4 :(得分:0)

您的喜欢与P11P12等以及P1匹配

您可以执行以下操作,首先寻找;P1;而不是P1

其次,修复边缘情况(标记在最后)。像这样:

SELECT id,name,tag FROM tbl1 WHERE concat(';',tag,';') LIKE '%;P1;%'