【问题标题】:SQL select rows where field contains word from another table's fieldsSQL选择字段包含另一个表字段中的单词的行
【发布时间】:2015-09-23 22:08:29
【问题描述】:

使用 MySQL,我有一个带有名称字段的表。我想根据一组“关键字”检查该名称字段,这些“关键字”表明该名称不是一个人,而是一个企业。

In words:如果名称包含任何关键字,则获取整行。

我的尝试: SELECT * FROM leads WHERE CONTAINS(leads.name, (SELECT word FROM keywords)); (返回“子查询返回多于 1 行”)

【问题讨论】:

  • 最好将关键字存储在联结表中,而不是使用全文索引。
  • @GordonLinoff 你能帮我理解这有什么帮助吗?我敢肯定,我只是看不到它。我会经常做这个手术,所以我很想知道。

标签: mysql sql select contains


【解决方案1】:

它不是那样工作的。您可以改用联接

SELECT l.* 
FROM leads l
JOIN keywords k on instr(leads.name, word) > 0 

【讨论】:

  • instr 如果您有诸如蝴蝶和黄油之类的关键字,则会给出误报(蝴蝶将作为搜索黄油的匹配项返回)。
  • 我不确定这是否真的是最好的解决方案,但我所有的关键字都被空格包围以避免这样的误报。到目前为止,我一直在以编程方式处理这个问题(我也用空格将名称括起来以确保我能抓住所有单词)。
【解决方案2】:

你在这里:

SELECT * FROM leads WHERE leads.name IN (SELECT word FROM keywords);

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    应该这样做:

    SELECT distinct
        l.* 
    FROM 
        leads l
        join keywords k on l.name = k.word
    

    编辑: 或类似的东西,如果你有一个逗号分隔列表

    SELECT distinct
        l.* 
    FROM 
        leads l
        join keywords k1 on l.name like concat('%,', k1.word)
        join keywords k2 on l.name like concat('%,', k2.word, ',%')
        join keywords k3 on l.name like concat(k2.word, ',%')
        join keywords k4 on l.name = k4.word
    

    【讨论】:

    • 谢谢,问题是l.name只能包含 k.word,不能等于
    • 添加更新以包含逗号分隔列表的情况
    【解决方案4】:

    对于数值,我使用带有逗号分隔符的 CONCAT 来确保找到准确的值。 在您的情况下,它将是:

    SELECT l.* FROM leads l 
    JOIN keywords k 
    on instr(CONCAT(',', leads.name, ','),  CONCAT(',', word, ',')) > 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      相关资源
      最近更新 更多