2015-07-25 3 views
1

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

programs 
HID 
HID,IWREM 
IWREM,ENVENG 
ENVENG,HID 
HID,ENVENG,IWREM 
IWREM 

Теперь то, что мне нужно, чтобы сделать его надлежащего разделенный запятыми список, с помощью собственно я имею в виду должны быть две запятые во всех значений (так как есть три программы), например, первое значение HID должна действительно по HID ,, а второй должен быть HID, IWREM,

Это необходимо, потому что я хочу, чтобы выполнить запрос, как это:

/* 2nd Priority Stats */ 
select 
sum(case when program like '%,HID%' then 1 else 0 end) as `IWRM`, 
sum(case when program like '%,IWRM%' then 1 else 0 end) as `IWRM`, 
sum(case when program like '%,ENVENG%' then 1 else 0 end) as `ENVENG` 
from table where degree = 'me'; 

Точно так же я хочу статистику для всех три приоритета.

У меня есть 3 программы, в которых учащиеся могут записаться в HID, IWREN, ENVENG. Они вл ютс абр. спрятал гидравлику, орошение & дренаж и т. д.

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

+3

магазин значения в трех столбцах (или в соединительная таблица с тремя рядами). Не используйте странные строковые операции в SQL, когда правильная структура данных позволяет использовать правильные SQL-инструкции. –

+0

Я бы не тратил времени на этот подход. очистить данные – Drew

+0

- это новая система, которая имеет так много данных и инерции, что изменение сделало бы ее маловероятной? – Drew

ответ

0

Хммм. Ваша структура данных все испорчена. Это должно быть либо три столбца, либо таблица соединений с тремя строками на объект. Тем не менее, я понятия не имею, зачем вам что-то менять. Почему бы просто не использовать правильные встроенные функции?

select sum(find_in_set('HID', program) > 0) as `HID`, 
     sum(find_in_set('IWRM', program) > 0) as `IWRM`, 
     sum(find_in_set('ENVENG', program) > 0) as `ENVENG` 
from table 
where degree = 'me'; 

В MySQL, вам не нужно case подсчитать количество совпадений в логическое выражение.

+0

Я не могу использовать это, потому что запятые представляют собой приоритеты. Я хочу знать, сколько учеников выбрали HID в качестве 1-го, 2-го и 3-го приоритетов. Другими словами, какие популярные программы –

+0

Вы можете использовать 'find_in_set()' для определения позиции. Тем не менее, я действительно думаю, что вы должны исправить структуру данных. –

0

Поскольку я нуждался в быстром решении, не меняя слишком много кода php для ввода и чтения данных, я исправил исправление, добавив 2 запятые. Теперь данные выглядит следующим образом:

id program 
1 "ENVENG,IWRM,HID" 
3 "ENVENG,," 
9 "IWRM,," 
13 "HID,IWRM," 
18 "ENVENG,," 
21 "IWRM,HID," 
23 "HID,," 
27 "ENVENG,," 

теперь я могу использовать запрос на выборку с как для подведения данных, которые будут использоваться для MORRIS диаграмм:

select 
sum(case when program like '%,HID,%' then 1 else 0 end) as `IWRM`, 
sum(case when program like '%,IWRM,%' then 1 else 0 end) as `IWRM`, 
sum(case when program like '%,ENVENG,%' then 1 else 0 end) as `ENVENG` 
from table where degree = 'me'; 

Однако, это не работает, если я имел 4 или больше программ, и, кроме того, эта техника просто отстой. Так, как @gordon Linoff & @Drew Pierce предлагает, он должен быть с соединительной таблице

вы имели в виду, как это:

Student table (junction, lookup or i dont know) 
Id PID 
1  3 
1  2 
1  1 
3  3 
9  2 
13 1 
13 2 
.... 

Program Table 
PID Program 
1 HID 
2 IWREM 
3 ENVENG 

ИЛИ

Student Table 
Id program (pri-keys from program table) 
1 3,2,1 
3 3 
9 2 
13 1,2 
18 3 
21 2,1 
...... 
Смежные вопросы