2016-01-09 88 views
1

我有这样的记录:MySQL的喜欢排除

  1. WW.FK
  2. WW.ZG.,WW.FK.
  3. WW.ZS.,WW.ZG.,WW.FK.
  4. WW.ZS.

我要排除这种记录只包含“FK”和检索那些包含比“Sk的”等,但它们可以包含“SK”

如果我使用的查询

NOT LIKE '%WW.FK.%' 

我只得到

  • WW.ZS.
  • ,我使用查询

    t LIKE '%WW.__.%' AND t not like '%WW.FK.%' 
    

    我会排除包含FK的所有记录。

    记录我想获得:

  • WW.ZG.,WW.FK.
  • WW.ZS.,WW.ZG.,WW.FK.
  • WW.ZS.
  • 什么是解决方案?

    回答

    -1

    我想你应该去掉百分号:

    `dual` NOT LIKE 'WW.FK' 
    
    +0

    这是不对的。他需要百分号,因为他正在检查子字符串。 – etalon11

    +0

    但是如果他想要删除的记录完全知道,并且等于'WW.FK',那么简单的不像'WW.FK'就可以工作。我误解了一些东西吗? – Eskay

    +0

    是的,再次阅读这个问题:-) – etalon11

    1

    解决的办法是停止存储的东西列出的字符串。该列包含某种类型的代码列表。它应该存储在联接表中,其中一列用于原始实体,另一列用于每个代码。列表(通常)应作为行存储在表中而不是分隔字符串。那么你可以更容易地表达你的查询。

    如果您遇到这种数据结构,那么正则表达式可能会有所帮助。事情是这样的:

    where not col rlike '^([^,]*[.]FK(,)+)+.$' 
    

    然而,试图找出每种类型的您可能希望真的只是浪费工作条件的权利正则表达式,因为正确的数据结构,使这要容易得多。

    +0

    我知道我有坏的结构,但我想现在得到的数据莫名其妙。 我只想要包含'%WW .__。%'的记录 – Enteee

    0

    您可以尝试使用子查询等。

    SELECT 
        * 
    FROM 
        `table_name` 
    WHERE t NOT IN 
        (SELECT 
        t 
        FROM 
        `table_name` 
        WHERE t LIKE '%WW.FK%')