【问题标题】:how to search in many columns? [duplicate]如何在多列中搜索? [复制]
【发布时间】:2019-08-09 13:23:10
【问题描述】:

在我的数据库中,这个表中有一个表和6列

----------------------------------
|id|word|translation|forms|translation_form|tags|
|4 |a   |b          |d,s,h|t,y,p           |b,o |
|2 |p   |a          |d,f,k|t,y,o           |v,i |
|0 |n   |br         |d,f,a|t,y,n           |u,i |
|1 |o   |br         |d,f,b|t,y,a           |u,g |
|3 |t   |br         |d,f,b|t,y,p           |a,g |


----------------------------------

搜索词是“a”

我想先在 (word) 中搜索,然后在其他列中搜索

并像这样对它们进行排序 第一个 id 4 比 2 然后 0 然后 1 然后 3

我用过

SELECT * FROM dictionary WHERE 
MATCH(`word`) against('a*' in boolean MODE) OR
MATCH(`translation`) against('a*' in boolean MODE) OR
MATCH(`forms`) against('a*' in boolean MODE) OR
MATCH(`translation_forms`) against('a*' in boolean MODE) OR
MATCH(`tags`) against('a*' in boolean MODE)

我得到了结果,但不是按照我描述的顺序 如何对它们进行排序

【问题讨论】:

  • 您不应该将 csv 值存储在数据库中 ..
  • 但更重要的是 - 在问 SO 之前您尝试了什么?
  • 如果你真的需要坚持这个模式,那么你应该考虑Full-Text Search并使用权重进行排序。
  • 谢谢,我编辑了我的问题。

标签: php mysql sql database match


【解决方案1】:

我相信下面的查询应该会给你想要的结果,但是正如 @treyBake 在 cmets 中提到的那样,这似乎是一种使用数据库的低效方式(因此,下面的查询也会很慢,如果你的表中有很多行)

SELECT *
FROM table
ORDER BY
   IF(word LIKE '%a%', 16,0)
  +IF(translation LIKE '%a%', 8, 0)
  +IF(forms LIKE '%a%', 4, 0)
  +IF(translation_form LIKE '%a%', 2, 0)
  +IF(tags LIKE '%a%', 1, 0) DESC

【讨论】:

  • 只是一个注释。除了“位排序”,您可以只使用ORDER BY 多个伪列,如if(word LIKE '%a%', 1,0) desc, if(translation LIKE '%a%', 1, 0) desc, if(forms LIKE '%a%', 1, 0) desc, if(translation_form LIKE '%a%', 1, 0) desc, if(tags LIKE '%a%', 1, 0) desc。 +1
  • 好点,这也可以,而且可能更容易理解:)
  • 从问题看来,要求是匹配整个单词而不是子字符串。
  • 谢谢,我编辑了我的问题。
【解决方案2】:

在 MySQL 中,你可以使用find_in_set():

where find_in_set('a', word) desc,
      find_in_set('a', translation) desc,
      . . .

desc 排序是因为find_in_set() 返回0,如果没有找到并且您希望它排在最后。

您绝对应该考虑重新审视您的数据模型。在列中存储事物列表绝对不是 SQL-ish 存储值的方式。您应该使用单独的联结表,每个列表列一个。

【讨论】:

  • 谢谢,我编辑了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 2016-02-24
  • 2015-05-20
  • 1970-01-01
  • 2016-08-31
  • 2020-03-06
  • 2016-10-04
相关资源
最近更新 更多