【问题标题】:SQL condition: (A=B AND C LIKE %D%) OR (A LIKE %B% AND C=D)SQL 条件:(A=B AND C LIKE %D%) OR (A LIKE %B% AND C=D)
【发布时间】:2011-06-13 19:45:05
【问题描述】:

我有一个名字和姓氏的表格。

我正在尝试对输入进行 jQuery 即时搜索,以便在庞大的人员列表中快速准确地找到一个人。

在输入中输入第一个单词时,它可能是名字或姓氏。

我这样做:SELECT * FROM myTable WHERE firstName LIKE %content% OR lastName LIKE %content%

当输入两个单词时,它可能是: * 完整的名字和一些姓氏 * 完整的姓氏和一些名字

所以我尝试了这个查询:SELECT * FROM myTable WHERE (firstName = content1 AND lastName LIKE %content2%) OR ( lastName = content1 AND firstName LIKE %content2%)

可惜括号好像什么都没做,而且查询不是这样解释的,我得到了很多结果,基本上是由两个LIKE %% 条件产生的

以前有人处理过这个问题并且可以帮帮我吗?

感谢

【问题讨论】:

  • 只是为了澄清-在您的第二个查询中, content 和 %content% 实际上代表不同的字符串,对吗?所以,你不是在做 firstName = 'John Sm' AND lastName LIKE '%John Sm%',而是 firstname = 'John' AND lastName LIKE '%Sm%'?
  • 你的意思是SELECT * FROM myTable WHERE (firstName = content1 AND lastName LIKE %content2%) OR ( lastName = content2 AND firstName LIKE %content1%)
  • 是的,我的错误。正上方。我已经编辑了我的问题

标签: php sql mysql conditional-statements


【解决方案1】:

如果其中一个词是全名的全名,而另一个词是另一个词的一部分,为什么不先拆分这些词呢?然后你会传入两个参数并有:

SELECT
    *
FROM
    myTable
WHERE
    (
        firstName = %content1%
        AND lastName LIKE %content2%
    ) OR (
        lastName = %content1%
        AND firstName LIKE %content2%
    )

【讨论】:

  • 这几乎就是答案。更像是 LIKE content2% 不是吗?
  • @CoBaLt2760:你是对的——看起来我遇到了格式问题;我已经更正了。
【解决方案2】:

我相信您将需要拆分输入的两个单词并在查询中独立使用它们。

【讨论】:

    【解决方案3】:

    它可能会这样工作(假设这两个词在内容变量中):

    SELECT ... WHERE
       CONCAT(firstName, " ", lastName) LIKE content%
       OR CONCAT(lastName, " ", firstName) LIKE content%
    

    但是这种方法效率不高(不使用索引)。我会将这两个词分成两个变量(word1、word2)并使其类似于:

    SELECT ... WHERE
        (firstName = word1 AND lastName LIKE word2%)
        OR (lastName = word1 AND firstName LIKE word2%)
    

    【讨论】:

    • 感谢您的回答,您对 content% 而不是 %content% 是正确的
    【解决方案4】:
    SELECT * FROM myTable WHERE 
        (firstName = 'content1' AND lastName LIKE content2%) 
    OR 
        (lastName = 'content1' AND firstName LIKE content2%)
    

    【讨论】:

      【解决方案5】:

      当输入两个单词时,它可能 be: * 完整的名字和一点 姓氏 * 完整的姓氏和 名字的一部分

      如果是所有(完全匹配)名字或姓氏,那么 = 测试似乎是正确的。以防万一它是 PHP 部分的错误,它应该是这样的。

      $qry = '
      SELECT * FROM myTable
      WHERE (firstName = content1 AND lastName LIKE '%".mysql_real_escape_string(content2)."%')
         OR ( lastName = content1 AND firstName LIKE '%".mysql_real_escape_string(content2)."%')';
      

      如果两者都有,那么你需要两次通配符

      $qry = '
      SELECT * FROM myTable
      WHERE (firstName LIKE '%".mysql_real_escape_string(content1)."%' AND lastName LIKE '%".mysql_real_escape_string(content2)."%')
         OR ( lastName LIKE '%".mysql_real_escape_string(content1)."%' AND firstName LIKE '%".mysql_real_escape_string(content2)."%')';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-28
        • 2015-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多