【问题标题】:Combining AND OR in SQL statement?在 SQL 语句中结合 AND OR?
【发布时间】:2018-08-10 07:04:07
【问题描述】:

使用 laravel,这是我的控制器文件中的一些代码:

    public function postsearch(Request $request){

    $searchItem=$request['searchItem'];
    $searchLocation=$request['searchLocation'];

    $criteria=$request['criteria'];

    if($criteria == 'schools'){

    $result=schools::whereRaw("MATCH(name,describtion) AGAINST('$searchItem') AND MATCH(location) AGAINST('$searchLocation')")->where('status','')->get();

    if(count($result)>0){

    $count=count($result);

    return view('schools', array('result' => $result))->with(array('searchItem'=>$searchItem,'searchLocation'=>$searchLocation,'criteria'=>$criteria,'count'=>$count))->with('searchItem',$searchItem); 

    }

    else{

        return view('schools')->with(array('msg'=>'Oops, No result found','count'=>'0','searchItem'=>$searchItem,'searchLocation'=>$searchLocation,'criteria'=>$criteria));

    }

    }

这是我正在尝试编辑的代码:

  $result=schools::whereRaw("MATCH(name,describtion) AGAINST('$searchItem') AND MATCH(location) AGAINST('$searchLocation')")->where('status','')->get();

如果我试图搜索一所学校,但我只输入了学校名称而不是位置,我会得到 0 个结果。我必须输入学校所在的位置。但我想让网站在该人不知道位置的情况下在其所在的每个位置显示学校。现在,我必须输入学校的位置才能显示在结果中。

其次,如果学校名称是“佛罗里达州立大学 (FSU)”,我必须输入“佛罗里达州立大学”才能显示该学院。 “佛罗里达”或“FSU”不起作用。有没有办法修复它,以便在搜索查询与名称的任何部分匹配时显示数据库中的项目?

更新:

必须付钱给一个人才能想出一个有效的代码:

        $result=schools::where('<put the variable you are searching for here>', 'LIKE', '%'.$searchItem.'%')
            ->where('location', 'LIKE', '%'.$searchLocation.'%')
            ->where('status','')->orderBy('name', 'asc')->get();

【问题讨论】:

  • SQL LIKE 运算符怎么样??w3schools.com/sql/sql_like.asp
  • 那么我应该把 LIKE 放在哪里呢? MATCH () 反对 () LIKE MATCH () 反对()?
  • whereRaw("name,description LIKE '$searchItem'.'%' OR location LIKE '$searchLocation'.'%' ")->where('status','')->get ();
  • SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以了解正确的语法使用
  • 我已经发布了答案,请尝试一下。如果您需要任何帮助,请告诉我。

标签: php sql laravel-5


【解决方案1】:

试试这个:

$result=schools::whereRaw("MATCH(name,describtion) AGAINST('$searchItem') OR MATCH(location) AGAINST('$searchLocation')")->where('status','')->get();

【讨论】:

    【解决方案2】:
    $result=schools::whereRaw("MATCH(name,describtion) 
    AGAINST('$searchItem') AND MATCH(location) 
    AGAINST('$searchLocation')")->where('status','')->get();
    

    用这个替换

        $result = schools::where(function ($q) use ($searchItem, $searchLocation)
                        {
                            return $q->where('name', 'LIKE', 
                             $searchItem. '%')
                              ->orWhere('description', 'LIKE', '%' . 
                                    $searchItem. '%');
                                ->orWhere('location', 'LIKE', '%' . 
                                    $searchLocation. '%');
                                         });
       $result->where('status','')->get();
    

    【讨论】:

    • ErrorException (E_NOTICE) 使用未定义的常量学校 - 假定为“学校”
    • 它有效,但现在没有显示结果。应该看到学校的地方,只是一块空地。
    • Thomas 让我们也添加描述并尝试检查代码并进行更改
    • 必须删除第一个 orWhere 语句后的分号,因为出现了一个错误,表示意外“->”
    • 但学校仍未显示在结果区域中。
    【解决方案3】:

    你可以改变这个

    $result=schools::whereRaw("MATCH(name,describtion) 
    AGAINST('$searchItem') AND MATCH(location) 
    AGAINST('$searchLocation')")->where('status','')->get();
    

    $result=schools::where('name', 'LIKE', '%'.$searchItem.'%')
                     ->orWhere('describtion', 'LIKE', '%'.$searchItem.'%')
                     ->orWhere('location', 'LIKE', '%'.$searchLocation.'%')
                     ->where('status','')->get();
    

    我还注意到您写了“描述”。确定不是说明?还有你为什么要检查空字符串的状态?

    【讨论】:

    • 原始代码使用“描述”。最初编写代码的人不太擅长拼写常见的英语单词。
    • 好的,这段代码有效。问题是现在它显示的学校甚至不匹配查询。可能有一所学校名称中带有“UP”或“FEU”,并且出现了一大堆学校。带有“FEU”的学校在列表中显示为第 20 个结果。
    • 这可能是因为查询也在其描述中搜索相同的名称,描述可能包含术语“FEU”或“UP”。并且数据按其 id 排序,而不是相关性。
    • 该查询还会返回与该术语相似的所有数据。例如,术语“UP”与“UPWARD”或“CUP”或“CUPBOARD”匹配
    • 我删除了描述代码,但学校仍然显示在搜索结果中。我可以在“Far”中搜索“Far Eastern University”学校,“CENTRO ESCOLAR UNIVERSITY - MANILA”将是第一个弹出的。 (是的,这些都是菲律宾大学)。
    猜你喜欢
    • 2016-04-13
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    相关资源
    最近更新 更多