【问题标题】:MySQL - NOT IN LIKEMySQL - 不喜欢
【发布时间】:2012-03-17 08:38:05
【问题描述】:

如何在 mysql 中检查一个值是否在另一个表的多个字段中?

类似

SELECT * FROM table WHERE concat('%',value,'%') NOT LIKE IN(SELECT field FROM anothertable)

但我认为这不太对,是吗?

【问题讨论】:

    标签: mysql sql-like in-operator not-operator


    【解决方案1】:

    不,不完全是。

    SELECT * FROM table WHERE NOT EXISTS (
        SELECT * from anothertable WHERE field LIKE CONCAT('%',value,'%')
    )
    

    可能会这样做。假设valuetable 上的一列,fieldanothertable 上的对应列,它可能包含也可能不包含value 作为子字符串。

    但请注意——如果anothertable 包含许多行,这将是一个非常慢的查询。我认为没有索引可以帮助您。 MySQL 必须对table 中的每一行进行anothertable 的字符串比较表扫描。

    【讨论】:

    • 我认为它会很慢,但我只是在运行一次性维护查询。
    • 顺便说一句,我刚刚更新了一个错字——我在子查询中用“不喜欢”代替了“喜欢”。
    【解决方案2】:

    下面的查询应该可以做到。

    SELECT DISTINCT t.* 
    FROM   table t, 
           anothertable a 
    WHERE  a.field NOT LIKE Concat('%', t.`value`, '%'); 
    

    【讨论】:

    • 这在某种程度上会更快还是更好?
    • 是的,如果字段和值被索引,它会更快
    • 我比较了两者,这个比第一个快4倍。
    • 哇哦,在最后一次修改之后,几乎是即时的。
    【解决方案3】:

    如果我正确理解了您的问题(假设您希望从“anothertable”中的 2 个字段(字段 1 和字段 2)的表中查找值):

    SELECT * 
    FROM table t 
    WHERE EXISTS (SELECT Count(*) FROM anothertable WHERE field1 LIKE concat('%',t,value,'%') OR field2 LIKE concat('%',t,value,'%')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-17
      • 2019-07-03
      • 2014-03-30
      • 2013-05-26
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多