PHP MySQLi - 按情况排序不正常工作
PHP MySQLi - order by case not rly working
这是我的代码:
$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
时,即使条件 when $sortstring then 2
应该在 when $sortstring2 then 3
之前,然后把它放在相反的位置对吗?
也许您预期的排序逻辑是执行多个 ORDER BY 条件。
在搜索字符串的左侧和右侧添加 space 将意味着当第一个词或最后一个词匹配时,您将无法准确匹配。出于这个原因,我必须敦促您使用较慢的函数 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.
这是我的代码:
$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
时,即使条件 when $sortstring then 2
应该在 when $sortstring2 then 3
之前,然后把它放在相反的位置对吗?
也许您预期的排序逻辑是执行多个 ORDER BY 条件。
在搜索字符串的左侧和右侧添加 space 将意味着当第一个词或最后一个词匹配时,您将无法准确匹配。出于这个原因,我必须敦促您使用较慢的函数 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.