【问题标题】:PHP MySQLi - order by case not rly workingPHP MySQLi - 按案例排序不正常工作
【发布时间】:2018-05-06 12:37:56
【问题描述】:

这是我的代码:

   $q = '8gb pro';

   $sforeach = explode(' ', $q);

   $treffer = "when (titel LIKE '% $q %') then 1";

    $sortstring = "";       
    foreach($sforeach as $sf)
    {
        $sortstring .= "(titel LIKE '% $sf %') AND";
    }
    $sortstring = rtrim($sortstring, ' AND');

    $sortstring2 = "";
    foreach($sforeach as $sf)
    {
        $sortstring2 .= "(beschreibung LIKE '% $sf %') AND";
    }
    $sortstring2 = rtrim($sortstring2, ' AND');

    $sort = "order by case
                   $treffer
                    when $sortstring then 2
                    when $sortstring2 then 3
                    else 4
                    end, views DESC";

当我搜索让我们说8gb pro 时,带有title 的行(如Acer TravelMate P648-MG-71S5)会显示在带有类似Dell Radeon Pro WX 7100 8GB GDDR5 的标题的行之前,即使条件when $sortstring then 2 应该在when $sortstring2 then 3 之前并将其放在另一个对不对?

【问题讨论】:

  • 啊,我在我的真实代码中看到了 sry,它并不是真正的 '$q' 而是 $q 它发生在此处放置一个简单版本以便更好地理解时。请删除您的 cmets ^^
  • 我们只是不够清楚——我们需要查看一些表格数据和您呈现的查询。您能否模拟我们一个 sqlfiddle 演示链接,以便我们可以看到正在重现的问题?
  • 好的,我会在检查一些替代订购方式后尝试
  • 看起来我从stackoverflow.com/questions/3609166/mysql-order-by-like 获得的整个解决方案不起作用,因为我尝试了简单的方法:$sort = "order by case when title LIKE '% 8gb %' then 1 end ";它仍然无法正常工作,但再次显示另一个订单。所以我真的需要寻找另一种解决方案
  • 好的,如果我找不到替代品,我会的,谢谢

标签: php sql mysqli sql-order-by case


【解决方案1】:

也许您的预期排序逻辑是执行多个 ORDER BY 条件。

在搜索字符串的左侧和右侧添加空格将意味着当第一个单词或最后一个单词匹配时,您将无法准确匹配。出于这个原因,我必须敦促您使用速度较慢的函数REGEXP 及其冗长的单词边界标记。

代码:(Demo) (A basic SQLFiddle Demo)

$q = '8gb pro';
$parts = explode(' ', $q);

$sort = "ORDER BY";
$sort .= " (CASE WHEN `titel` REGEXP '[[:<:]]{$q}[[:>:]]' THEN 1 ELSE 2 END),";
$sort .= " (CASE WHEN `titel` REGEXP '[[:<:]]" . implode("[[:>:]]' AND `titel` LIKE '[[:<:]]", $parts) .  "[[:>:]]' THEN 1 ELSE 2 END),";
$sort .= " (CASE WHEN `beschreibung` REGEXP '[[:<:]]" . implode("[[:>:]]' AND `beschreibung` LIKE '[[:<:]]", $parts) .  "[[:>:]]' THEN 1 ELSE 2 END),";
$sort .= " `views` DESC";

echo $sort;

输出:

ORDER BY
 (CASE WHEN `titel` REGEXP '[[:<:]]8gb pro[[:>:]]' THEN 1 ELSE 2 END),
 (CASE WHEN `titel` REGEXP '[[:<:]]8gb[[:>:]]' AND `titel` LIKE '[[:<:]]pro[[:>:]]' THEN 1 ELSE 2 END),
 (CASE WHEN `beschreibung` REGEXP '[[:<:]]8gb[[:>:]]' AND `beschreibung` LIKE '[[:<:]]pro[[:>:]]' THEN 1 ELSE 2 END),
 `views` DESC

link explaining the word boundary syntax

【讨论】:

  • 这是一个非常好的解决方案,工作正常:D 谢谢!
猜你喜欢
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
  • 2016-07-06
相关资源
最近更新 更多