Этот дизайн далеко не оптимален, если не сказать больше, но чтобы ответить на ваш вопрос, насколько я знаю, вы не можете присоединиться к таблицам, где имя столбца второй таблицы - это значение столбца (и вы, безусловно, не можете переносимо). Тем не менее, я думаю, что вы после того, как можно записать так с вашей текущей схеме:
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 и должно решить вашу проблему так же, как хорошо, когда используется должным образом.
Ваше описание неясное. Также дайте ввод и вывод данных образца. – philipxy
Я подозреваю, что мне может понадобиться PIVOT, но я понятия не имею, как это сделать, и запутываться, пытаясь понять ресурсы там (хотя в последнее время это так, может быть, смысл завтра -: os) Выше все, что я есть в базе данных в настоящее время ... Я хочу создать SQL-запрос, который заменит cat1, cat2, cat3 в таблице2, с описаниями для каждого из них, которые находятся в таблице1 ... –
Заменить как? И «...» и «... и т. Д.» Не являются образцами данных, а «>>>» не является столбцом. И мы не можем догадаться, что вы пытаетесь сделать, когда вывод - это всего лишь куча списков всех значений. Дайте образцы данных, которые будут содержать информацию о том, как получается выход с входа. (Так как вы, похоже, не можете объяснить себя словами.) – philipxy