Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 当使用OR给出两个条件时,如何在MYSQL中设置条件的优先级?_Php_Mysql - Fatal编程技术网

Php 当使用OR给出两个条件时,如何在MYSQL中设置条件的优先级?

Php 当使用OR给出两个条件时,如何在MYSQL中设置条件的优先级?,php,mysql,Php,Mysql,我有以下代码: $sqlquery1 = "SELECT * FROM item WHERE item.title LIKE '%abc%' OR item.idescription LIKE '%abc%'"; 这是完美的运行 唯一需要考虑的是,我想先显示第一个或条件(item.title)的结果,然后再显示下一个条件 电流输出的Eg值: 标题:代数 描述:abcinc 标题:AB

我有以下代码:

  $sqlquery1 = "SELECT * 
                FROM item 
                WHERE item.title LIKE '%abc%' 
                   OR item.idescription LIKE '%abc%'";
这是完美的运行

唯一需要考虑的是,我想先显示第一个或条件(item.title)的结果,然后再显示下一个条件

电流输出的Eg值:

标题:代数
描述:abcinc

标题:ABC
描述:DSINC

标题:AlABCad
描述:sds公司

期望输出的Eg:

标题:ABC
描述:DSINC

标题:AlABCad
描述:sds公司

标题:代数

描述:abcinc

如果希望按特定顺序返回行,请添加一个
orderby
子句

为了满足规定的规范,这就足够了:

 ORDER BY item.title LIKE '%abc%' DESC
这是可行的,因为MySQL对布尔表达式求值并将结果作为整数返回:TRUE作为1返回,FALSE作为0返回,NULL或unknown作为NULL返回。我们可以通过一个简单的测试来证明这一点,例如

SELECT 'abc' LIKE '%abc%'
     , 'foo' LIKE '%abc%'
     ,  NULL LIKE '%abc%'
并且可以看到MySQL分别返回1、0和NULL


就我个人而言,我更喜欢按的顺序使用更多的表达式,以使结果更具确定性,从而保证以可预测和可重复的顺序返回行。

您可以为每个匹配条件指定一个值,并按此顺序进行排序。当您这样做时,最好有一个“平局打破者”顺序,这样您就不会随机排列所有标题匹配,然后再随机排列所有描述匹配:

SELECT *
FROM item
WHERE item.title LIKE '%abc%' OR item.idescription LIKE '%abc%'
ORDER BY
  CASE(WHEN item.title like '%abc%' THEN 1 ELSE 0 END),
  item.title,
  item.description;

这与spencer7593的解决方案类似,只是如果需要,它可以扩展为处理两个以上的“或”条件。

扩展其他答案,您可能希望将术语出现在
标题和
描述中的项目排名高于仅出现在
标题中的项目

SELECT * , title_score + description_score AS total_score
FROM (
    SELECT * , title LIKE '%abc%' AS title_score, description LIKE '%abc%' AS description_score
    FROM item
    WHERE title LIKE '%abc%'
OR description LIKE '%abc%'
) AS temp_tbl
ORDER BY total_score DESC, title_score DESC, description_score DESC
除了这些答案之外,您还可以使用
全文
索引和
分数
结果,该结果将根据搜索到术语的次数对您的搜索进行排序

SELECT * , MATCH(title, description) AGAINST ('*abc*') AS score
    FROM item
    WHERE MATCH(title, description) AGAINST ('*abc*' IN BOOLEAN MODE)
    ORDER BY score DESC