Как получить максимальное значение в поле MySQL, разделенном запятыми? - PullRequest
0 голосов
/ 21 марта 2012

У меня есть таблица MySQL с полем значений, разделенных запятыми.Как получить максимальное значение?

Пример:

CREATE TABLE `test`.`scale` (`scale` VARCHAR(500));

INSERT INTO `test`.scale 
VALUES 
('1,5,0.3,0.8,1'), 
('0.5,0.7,0.1,0.3'), 
('7,0.5,0.7,4');

шкала:

1,5,0.3,0.8,1
0.5,0.7,0.1,0.3
7,0.5,0.7,4

ответ:

5
0.7
7

Как мневыбрать максимальное значение в этой строке?

К сожалению, я не могу изменить способ, которым предыдущий человек реализовал решение, разделенное запятыми.Я надеюсь, что есть функция MySQL, которая может мне помочь, в противном случае мне придется делать некоторые грязные вещи PHP.

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Я не верю, что в SQL есть функция для разделения строк. Вот код, который утверждает, что делает это , но я не проверял это.

Более глубокая причина этого в том, что SQL отчаянно хочет, чтобы вы сохранили ваши данные в нормализованной форме .В данном конкретном случае это означает, что каждое поле должно представлять один фрагмент данных о предмете строки.

По сути, вы должны хранить scale и answer в двухотдельные таблицы, которые можно сопоставлять друг с другом, используя идентификатор для вопроса, к которому принадлежит каждый.Шкала будет иметь одну строку для каждой шкалы, а не одну строку для шкалы:

OPTIONS                     ANSWERS
question | scaleoption      question | answer
---------|------------      ---------|-------
       1 | 1.5                    1  | 5
       1 | .3                     2  | .7
       1 | .8               ... 
       1 | 1
       2 | .5
       2 | .7
...

Затем можно использовать запрос select max(scaleoption) from options where question = 2, чтобы получить максимальную опцию для вопроса 2. Этот формат также позволяет вам выполнять такие действиянайти все вопросы, в которых один из вариантов равен 1, или подсчитать, сколько вариантов имеет конкретный вопрос.Это выглядит сложнее, но это гибкий, расширяемый, портативный способ делать вещи.

Если вы хотите использовать свой текущий формат, вам придется вернуть всю строку и разбить ее на каком-нибудь другом языке программирования.

0 голосов
/ 22 марта 2012

создать курсор в процедуре, чтобы выбрать каждую строку и вставить в новую таблицу с разделением каждого поля, разделенного запятыми, используя вложенный substring_index, а затем выбрать max из этой новой таблицы, установить цикл с помощью курсора, чтобы повторить это для всей таблицы, и сохранитьМаксимум каждой строки в новой таблице. В конце выберите * из финальной таблицы.

...