2015-01-19 3 views
0

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

У меня есть следующие 2 таблицы :

Таблица 1 (ambro_awards_categories):

id cat_name category 
1 cat1  Would most likely know how to fondue an ant 
2 cat2  Most Likely to survive a nuclear winter 
3 cat3  Most Likely to survive a nuclear winter 
4 cat4  Category 4 
5 cat5  Category 5 
6 cat6  Category 6 
7 cat7  Category 7 
8 cat8  Category 8 
9 cat9  Category 9 

и в таблице 2 (ambro_awards):

id voter_name   cat1    cat2    cat>>>  date 
1 Cavey Charlesworth Cavey Charlesworth Cavey Charlesworth ...   2015-01-18 00:00:00 
2 Lynn Wylder   Lynn Wylder   Lynn Wylder   ...   2015-01-18 00:00:00 
3 Lynn Wylder   Peter Parker  Batman    ...   2015-01-18 00:00:00 
etc 

Что я хочу делать (и я полностью согласен с тем, что, вероятно, это лучший способ сделать это), нужно объединить все вместе в 1 большую таблицу, присоединенную к cat1, cat2 и т. Д. Чтобы я мог изменить имена категорий до более длинных, более описательных имен, без удлинения второй таблицы.

Это означало бы делать это на значения cat_name таблицы 1 к cat1, имена столбцов cat2 в таблице 2.

требуемый результат будет что-то вроде:

Would most likely know how to fondue an ant (ie "Category 1") 
    name 1 
    name 2 
    name 3 
    name 4... etc 

Most Likely to survive a nuclear winter (ie "Category 2") 
    name 1 
    name 2 
    name 3 
    name 4... etc 

Most likeley to succeed (ie "Category 3") 
    name 1 
    name 2 
    name 3 
    name 4... etc 

Такого рода вещи ...

Если просто добавить несколько имен в таблицу 1, я сделаю это, но подумал, что это может быть немного неправильно ... Был надеяться сделать выше, но затем столкнулся с проблемами ...

Pj.

+0

Ваше описание неясное. Также дайте ввод и вывод данных образца. – philipxy

+0

Я подозреваю, что мне может понадобиться PIVOT, но я понятия не имею, как это сделать, и запутываться, пытаясь понять ресурсы там (хотя в последнее время это так, может быть, смысл завтра -: os) Выше все, что я есть в базе данных в настоящее время ... Я хочу создать SQL-запрос, который заменит cat1, cat2, cat3 в таблице2, с описаниями для каждого из них, которые находятся в таблице1 ... –

+0

Заменить как? И «...» и «... и т. Д.» Не являются образцами данных, а «>>>» не является столбцом. И мы не можем догадаться, что вы пытаетесь сделать, когда вывод - это всего лишь куча списков всех значений. Дайте образцы данных, которые будут содержать информацию о том, как получается выход с входа. (Так как вы, похоже, не можете объяснить себя словами.) – philipxy

ответ

1

Этот дизайн далеко не оптимален, если не сказать больше, но чтобы ответить на ваш вопрос, насколько я знаю, вы не можете присоединиться к таблицам, где имя столбца второй таблицы - это значение столбца (и вы, безусловно, не можете переносимо). Тем не менее, я думаю, что вы после того, как можно записать так с вашей текущей схеме:

CREATE VIEW ambro_full_data AS 
SELECT a.id as aid, c.id as cid, c.cat_name, 
    CASE c.cat_name 
     WHEN 'cat1' THEN a.cat1 
     WHEN 'cat2' THEN a.cat2 
     WHEN 'cat3' THEN a.cat3 
     WHEN 'cat4' THEN a.cat4 
     WHEN 'cat5' THEN a.cat5 
     WHEN 'cat6' THEN a.cat6 
     WHEN 'cat7' THEN a.cat7 
     WHEN 'cat8' THEN a.cat8 
     WHEN 'cat9' THEN a.cat9 
    END as name, 
    c.category, 
    a.date 
FROM ambro_awards_categories c 
    CROSS JOIN ambro_awards a; 

Например:

mysql> SELECT name FROM ambro_full_data WHERE cid = 1; 
+--------------------+ 
| name    | 
+--------------------+ 
| Cavey Charlesworth | 
| Lynn Wylder  | 
| Peter Parker  | 
+--------------------+ 
3 rows in set (0.00 sec) 

или

mysql> SELECT category,name FROM ambro_full_data ORDER BY cid; 
+---------------------------------------------+--------------------+ 
| category         | name    | 
+---------------------------------------------+--------------------+ 
| Would most likely know how to fondue an ant | Cavey Charlesworth | 
| Would most likely know how to fondue an ant | Lynn Wylder  | 
| Would most likely know how to fondue an ant | Peter Parker  | 
| Most Likely to survive a nuclear winter  | Lynn Wylder  | 
| Most Likely to survive a nuclear winter  | Batman    | 
| Most Likely to survive a nuclear winter  | Cavey Charlesworth | 
| Most Likely to survive a nuclear winter  | Lynn Wylder  | 
| Most Likely to survive a nuclear winter  | Cavey Charlesworth | 
| Most Likely to survive a nuclear winter  | Lynn Wylder  | 
| Category 4         | Cavey Charlesworth | 
| Category 4         | Lynn Wylder  | 
| Category 4         | Lynn Wylder  | 
| Category 5         | Lynn Wylder  | 
| Category 5         | Lynn Wylder  | 
| Category 5         | Cavey Charlesworth | 
| Category 6         | Lynn Wylder  | 
| Category 6         | Cavey Charlesworth | 
| Category 6         | Lynn Wylder  | 
| Category 7         | Cavey Charlesworth | 
| Category 7         | Lynn Wylder  | 
| Category 7         | Lynn Wylder  | 
| Category 8         | Lynn Wylder  | 
| Category 8         | Lynn Wylder  | 
| Category 8         | Cavey Charlesworth | 
| Category 9         | Cavey Charlesworth | 
| Category 9         | Lynn Wylder  | 
| Category 9         | Lynn Wylder  | 
+---------------------------------------------+--------------------+ 
27 rows in set (0.00 sec) 

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

Лучше дизайн, однако, будет иметь таблицы, как это:

CREATE TABLE ambro_awards (id ..., voter_name ..., date ...); (обратите внимание, нет catN колонн)

CREATE TABLE ambro_awards_categories (id ..., category ...); (обратите внимание, не столбец cat_name требуется)

CREATE TABLE ambro_awards_and_categories (a_id INTEGER NOT NULL, c_id INTEGER NOT NULL, name VARCHAR(<suitable length here>) NOT NULL, PRIMARY KEY (a_id, c_id), FOREIGN KEY (a_id) REFERENCES ambro_awards (id), FOREIGN_KEY (c_id) REFERENCES ambro_awards_categories (id));

С данными вашего образца последний стол будет выглядеть следующим образом:

a_id c_id name 
1  1  Cavey Charlesworth 
1  2  Cavey Charlesworth 
1  3  Cavey Charlesworth 
2  1  Lynn Wylder 
2  2  Lynn Wylder 
2  3  Lynn Wylder 
3  1  Lynn Wylder 
3  2  Peter Parker 
3  3  Batman 

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

SELECT c.category, ac.name FROM ambro_awards_and_categories ac JOIN ambro_awards_categories c ON c.id = ac.c_id;

И простые соединения могут быть использованы для извлечения других данных из другой таблицы. Например, исходное ambro_awards строка 1 может быть извлечено несколько строк с чем-то вроде

SELECT a.id, a.voter_name, a.date, ac.name FROM ambro_awards a JOIN ambro_awards_and_categories ac ON ac.a_id = a.id WHERE a.id = 1;

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

+0

А, это звучит прекрасно. Извините за то, что не объяснял лучше, но вы поняли, что я имел в виду ... Я пойду играть с этим, и я уверен, что с миром все будет в порядке. Спасибо за помощь :) –

+0

Если это признанный ответ, не могли бы вы согласиться? –

+0

Думаю, я сделал это. Но дай мне крик, если я сделаю это неправильно ... –