PHP MySQLi - порядок не работает - PullRequest
0 голосов
/ 06 мая 2018

Это мой код:

   $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 и помещать его в другое наоборот?

1 Ответ

0 голосов
/ 06 мая 2018

Возможно, ваша логика сортировки заключается в выполнении нескольких условий ORDER BY.

Добавление пробела слева и справа от строки поиска будет означать, что вы не будете точно совпадать, когда первое или последнее слово совпадают. По этой причине я должен убедить вас использовать более медленную функцию REGEXP с ее длинными маркерами границы слова.

Код: ( Демо ) ( Базовая демоверсия SQLFiddle )

$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

A ссылка, объясняющая синтаксис границы слова .

...