SQL - сортировка данных по первому приоритету при использовании LIKE в разделе

php mysql sql sorting

450 просмотра

2 ответа

492 Репутация автора

После поиска в Google я не смог найти ответ для сортировки данных по приоритету при использовании likeвclause

Я использую следующий запрос для сортировки и просмотра данных:

SELECT    i.name,i.add_time,round(i.price),s.store_address
FROM      store_items i,stores s
WHERE     i.store_id = s.store_id 
AND       (lower(i.name) LIKE '%samsung glaxy%'
   OR lower(i.name) LIKE '%samsung%'
   OR lower(i.name) LIKE '%glaxy%')
ORDER BY  i.price ASC LIMIT 0,25

Как я могу сортировать строки в результате , во - первых для Samsung Galaxy первого likeоператора в качестве первого приоритета, а затем строки для Samsung и Galaxy в качестве второго приоритета?

Пожалуйста, обратите внимание:

Первый приоритет означает, что результирующие строки должны быть показаны в первую очередь, а второй приоритет означает, что другие результирующие строки должны быть показаны после

Я должен соответствовать этому в моей функции PHP.

@ 10086'answer Я не могу вписать это в PHP CODE

Мой PHP-код:

$sort = $_COOKIE['sort'];
$price_sort = $_COOKIE['price_sort'];
$currency_value = $_COOKIE['currency_value'];

if (!isset($_GET['number'])) {
       $limit = 0;
}else{
      $limit = filter_var($_GET['number'], FILTER_SANITIZE_NUMBER_INT);
}

 $keyword_exp = explode(" ", $keyword); //separating keywords
 $like = ""; //for use like clause for every keyword
 $case = ""; // for priority selection case in query order
 $case_inc = 2;
 foreach ($keyword_exp as $value) {
          $like .= "AND lower(i.name) like '%$value%'"; 
          $case .= "WHEN lower(i.name) like '%$value%' THEN $case_inc";
          $case_inc += 1;
 } 
  //query performing to show result
  $sql_query = "SELECT i.name 'title',i.add_time 'time',round(i.price) 'price',round(i.new_price) 'new_price',s.store_address 'address' FROM store_items i,stores s WHERE i.store_id = s.store_id $like ORDER BY CASE WHEN lower(i.name) LIKE '%$keyword%' THEN 1 $case END ASC LIMIT 0,25";
  $query = mysql_query($sql_query) or die(mysql_error());
  while ($row = mysql_fetch_array($query)) :
               extract($row);
  endwhile;

Мой SQL-запрос в PHP-коде дает мне следующую ошибку:

У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, на предмет правильного синтаксиса, который можно использовать рядом со значением 'lower (i.name), например'% refurbished% 'THEN 3 END ASC LIMIT 0,25' в строке 1

Автор: Syed Aqeel Источник Размещён: 18.07.2016 09:39

Ответы (2)


1 плюс

11485 Репутация автора

Используйте CASE WHEN:

SELECT    i.name,i.add_time,round(i.price),s.store_address
FROM      store_items i,stores s
WHERE     i.store_id = s.store_id 
AND       (lower(i.name) LIKE '%samsung glaxy%' OR lower(i.name) LIKE '%samsung%' OR lower(i.name) LIKE '%glaxy%')
ORDER BY
CASE WHEN lower(i.name) LIKE '%samsung glaxy%' THEN 1
     WHEN lower(i.name) LIKE '%samsung%' THEN 2
     WHEN lower(i.name) LIKE '%glaxy%' THEN 3
     ELSE 4 END,
i.price ASC
LIMIT 0,25
Автор: Blank Размещён: 18.07.2016 09:44

1 плюс

23803 Репутация автора

Решение

Ваши запросы не будут такими быстрыми, как могли бы, потому что:

  1. Вы используете lowerфункцию, когда LIKEона уже нечувствительна к регистру. select 'a' LIKE 'A'вернусьtrue
  2. Использование столбца в качестве аргумента функции в ваших силах WHERE сервера для обхода его индексировать и обрабатывать строку: например: lower(i.name). Этого следует избегать в целом

Если у вас MySQL 5.6+, и если он store_items.nameимеет тип CHAR , VARCHAR или TEXT , то добавьте индекс FULLTEXT в ваш nameстолбец, чтобы оптимизировать его для текстового поиска.

ALTER TABLE store_items ADD FULLTEXT fulltext_name (name);

Затем измените ваш запрос, чтобы использовать MATCH...AGAINSTсинтаксис:

SELECT i.name,i.add_time,round(i.price),s.store_address
FROM store_items i JOIN stores s ON i.store_id = s.store_id
WHERE MATCH(i.name) AGAINST('samsung galaxy')

Этот поиск вернет все строки, которые имеют хотя бы одно из двух слов samsungи galaxy. Строки с обоими словами будут выше в наборе результатов.

Из документов :

MATCH () принимает список через запятую, в котором указаны столбцы для поиска. AGAINST принимает строку для поиска и необязательный модификатор, который указывает, какой тип поиска выполнять

...

Полнотекстовые индексы могут использоваться только с таблицами MyISAM. (В MySQL 5.6 и выше их также можно использовать с таблицами InnoDB.) Полнотекстовые индексы можно создавать только для столбцов CHAR, VARCHAR или TEXT.

Автор: BeetleJuice Размещён: 18.07.2016 10:19
Вопросы из категории :
32x32