как отсортировать мою таблицу с количеством успеха, как оператор выполняется в строке - PullRequest
1 голос
/ 04 января 2012

Я хочу запрос, который сортирует мою таблицу по количеству появлений фразы в строке.

Примерно так:

select * from table where paragraph like '%im%' order by (count of success like statement execute in row) 

_________________ 
| paragraph     | 
_________________ 
|hello im vahid| 

| and im happy | with 2 (im) 
_________________ 

в этом случае результат равен

_________________ 
| paragraph     | 
_________________ 
|hello im vahid | 

|and im happy   | 
_________________ 
|im vahid glad  | 

|to meet u      | 
_________________


да Gerrat, это правильно, каждая запись, которая содержит буквы «im» (в столбце абзаца), упорядоченная по убыванию частоты, сколько раз каждый абзац содержит буквы «im»
$trimmed1= "my paragraph";
$pieces = explode(" ", trim($trimmed1));

$query = "SELECT * FROM agahi
WHERE active='2' AND  (  ";
$countp = count($pieces);

for ($i = 0; $i < $countp-1; $i++) {

$query .="  CONCAT(sharh,' ',onvan,' ',kelid) LIKE '%".$pieces[$i]."%' OR ";
}
$query .=" CONCAT(sharh,' ',onvan,' ',kelid) LIKE '%".$pieces[$i]."%'  " ;
$query .= ")  

ORDER BY (";

for ($i = 0; $i < $countp-1; $i++) {
$query .=
"(
CASE WHEN  CONCAT(sharh,' ',onvan,' ',kelid) LIKE  '%".$piecesf[$i]."%'
THEN 1 
ELSE 0 
END
) + ";}

$query .= "(CASE WHEN  CONCAT(sharh,' ',onvan,' ',kelid) LIKE  '%".$piecesf[$i]."%'
THEN 1 
ELSE 0 
END )
) DESC ";

это мой код, но ORDER BY не работает верно

это сгенерированный код:

SELECT * FROM agahi WHERE active='2' AND ( CONCAT(sharh,' ',onvan,' ',kelid) LIKE '%cd%' OR CONCAT(sharh,' ',onvan,' ',kelid) LIKE '%dvd%' ) 

ORDER BY (
( CASE WHEN CONCAT(sharh,' ',onvan,' ',kelid) LIKE '%cd%' THEN 1 ELSE 0 END ) 
+ ( CASE WHEN CONCAT(sharh,' ',onvan,' ',kelid) LIKE '%dvd%' THEN 1 ELSE 0 END ) 
) DESC

Ответы [ 4 ]

1 голос
/ 04 января 2012
select * 
from table t 
inner join 
  (select tableID, numberToControlSort  
  from [put the rest of a query that calcs a priority on each row here]) s  
on t.tableID=s.tableID 
where [put your where clause here] 
order by s.numberToControlSort

Это будет работать.К сожалению, SQLServer не имеет стандартной процедуры, которая подсчитывает, сколько раз подстрока встречается в строке.Вы можете написать / найти функцию для этого и использовать эту функцию для numberToControlSort.

0 голосов
/ 05 января 2012

да да да это мой ответ:

SELECT (CHAR_LENGTH (sharh) - CHAR_LENGTH (REPLACE (sharh, 'cd', ''))) AS следующая длина

ОТ АГАИ

заказ по следующему номеру DESC

0 голосов
/ 05 января 2012
SELECT name, COUNT(*) as frequency 
FROM name_table 
GROUP BY name 
ORDER BY COUNT(*) DESC

Некоторые ребята говорят, чтобы использовать это. Это работает?

0 голосов
/ 05 января 2012

Получить длину значения paragraph, затем удалить из него все вхождения 'im' и получить длину полученной строки.Разница между двумя длинами даст вам значение, которое вы могли бы использовать для упорядочения набора результатов:

В MySQL запрос может выглядеть примерно так:

SELECT *
FROM atable
WHERE paragraph LIKE '%' + @testString + '%'
ORDER BY
  CHAR_LENGTH(paragraph) - CHAR_LENGTH(REPLACE(paragraph, @testString, ''))

, где @testStringваша 'im' или любая другая подстрока, с которой вы хотите проверить paragraph.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...