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