我希望运行一个数据库查询,如果用户在两列中查询多个子字符串,则可以查询它们。例如,
第1列是国家/地区名称,第2列是城市和国家/地区名称。样本数据:
Column1| Column2
USA | Portland, Oregon, United States of America
USA | Portland, Maine, United State of America
USA | Bellevue, Washington, United State of America
USA | Bellevue, Nebraska, United State of America
现在用户可以使用各种选项进行查询。例如:
Portland America
Portland USA
Portland Oregon USA
Portland Oregon America
Portland United States
... and so on
我希望构建一个可以为我解决此问题的查询。我尝试了where和orwhere的组合,但没有解决它。
进一步说明,第一栏中的国名也可以是中华民国。并且查询可以是来自同一列或列1和列2的两个单词或字符串的随机组合。或者它可以只是一个单词。
答案 0 :(得分:1)
在这种情况下,您将要分解字符串并搜索每个部分。
DB::table('table_name')->where(function($query) use ($string) {
$parts = explode(' ', $string);
foreach($parts as $part) {
$query->where('Column2', 'LIKE', "%$part%")
}
})->get();
这会将查询转换为以下内容:
SELECT * FROM table_name
WHERE Column2 LIKE '%Portland%'
AND Column2 LIKE '%America%'
要同时检查Column1,添加另一个where子句,但这次使用Or:
DB::table('table_name')->where(function($query) use ($string) {
$parts = explode(' ', $string);
foreach($parts as $part) {
$query->where('Column2', 'LIKE', "%$part%")
}
})->where(function($query) use ($string) {
$parts = explode(' ', $string);
foreach($parts as $part) {
$query->orWhere('Column1', 'LIKE', "%$part%")
}
})->get();
这将查询更改为
SELECT * FROM table_name
WHERE (Column2 LIKE '%Portland%'
AND Column2 LIKE '%USA%')
AND (Column1 LIKE '%Portland%' OR Column1 LIKE '%USA%')
如果他们搜索USA
,则可以,但如果他们搜索United States
则不行。您可能需要更多地优化搜索参数,或添加一种方法来将缩写与国家/地区名称匹配。
答案 1 :(得分:0)
DB :: select(DB :: raw(SELECT *,MATCH(column1,coulmn2)AGAINST('中华民国上海')AS得分来自表WHERE MATCH(column1,coulmn2)AGAINST(& #39;中华民国上海')));提供我正在寻找的答案。它主要在两列中使用FULLTEXT SEARCh。