Мне нужно отсортировать значения ячеек ниже, используя mysql

enter image description here

Пример:

  • ячейка содержит красный, синий, зеленый
  • Но я хочу, чтобы это было в алфавитном порядке.
0
Saravana Kumar 3 Янв 2018 в 14:05

2 ответа

Лучший ответ

Вы можете создать функцию, которая сортирует элементы в столбце:

create function f_comma_list_order ( t text )
returns text
begin

declare v_c int;

drop temporary table if exists tmp;
create temporary table tmp ( v text );


set v_c = 1;

while( v_c > 0 ) do
  select locate(',', t) into v_c;

  if (v_c>0) then
    insert into tmp select substr(t, 1, v_c-1);
    set t = substr(t, v_c+1);
  else 
    insert into tmp values (t);
  end if;
end while;

select group_concat(v order by v) into t
from tmp;

return t;

end

А затем вызвать функцию:

select f_comma_list_order('red,green,blue')
1
slaakso 3 Янв 2018 в 12:24

Как это сделать,

1. Сначала вам нужно вызвать процедуру для сортировки значений.

2. Вызовите процедуру , затем

Вот код для создания процедуры mysql

-- sort comma separated substrings with unoptimized bubble sort
DROP FUNCTION IF EXISTS sortString;
DELIMITER |
CREATE FUNCTION sortString(inString TEXT) RETURNS TEXT
BEGIN
  DECLARE delim CHAR(1) DEFAULT ','; -- delimiter 
  DECLARE strings INT DEFAULT 0;     -- number of substrings
  DECLARE forward INT DEFAULT 1;     -- index for traverse forward thru substrings
  DECLARE backward INT;   -- index for traverse backward thru substrings, position in calc. substrings
  DECLARE remain TEXT;               -- work area for calc. no of substrings
-- swap areas TEXT for string compare, INT for numeric compare
  DECLARE swap1 TEXT;                 -- left substring to swap
  DECLARE swap2 TEXT;                 -- right substring to swap
  SET remain = inString;
  SET backward = LOCATE(delim, remain);
  WHILE backward != 0 DO
    SET strings = strings + 1;
    SET backward = LOCATE(delim, remain);
    SET remain = SUBSTRING(remain, backward+1);
  END WHILE;
  IF strings < 2 THEN RETURN inString; END IF;
  REPEAT
    SET backward = strings;
    REPEAT
      SET swap1 = SUBSTRING_INDEX(SUBSTRING_INDEX(inString,delim,backward-1),delim,-1);
      SET swap2 = SUBSTRING_INDEX(SUBSTRING_INDEX(inString,delim,backward),delim,-1);
      IF  swap1 > swap2 THEN
        SET inString = TRIM(BOTH delim FROM CONCAT_WS(delim
        ,SUBSTRING_INDEX(inString,delim,backward-2)
        ,swap2,swap1
        ,SUBSTRING_INDEX(inString,delim,(backward-strings))));
      END IF;
      SET backward = backward - 1;
    UNTIL backward < 2 END REPEAT;
    SET forward = forward +1;
  UNTIL forward + 1 > strings
  END REPEAT;
RETURN inString;
END |
DELIMITER ;

Чтобы вызвать процедуру , вам нужно использовать,

-- example call:
SET @Xstr  = "red,blue,green"; // for query purpose only you need to write within (SQL Query here for that row)

SELECT sortString(@Xstr) AS s1

См. карту руководства документации Нажмите здесь, чтобы прочитать

Также есть альтернативный способ сделать, если вы заинтересованы в изучении, - это то, что о FIND_IN_SET, вы можете найти некоторую идею из одного из вопросов из stackoverflow. Нажмите здесь, чтобы прочитать

3
Sanjay Kumar Singh 3 Янв 2018 в 12:38