Динамическое имя столбца в MYSQL - PullRequest
0 голосов
/ 16 сентября 2009

Вчера я облажался, задавая вопрос, который случайно назвал двойную колонку. Это вызвало интересные решения. Поэтому здесь я снова задам тот же вопрос, но на этот раз я напрямую отправлю дамп mysql, чтобы не было путаницы.

CREATE TABLE `tbl1` (
  `UserID` char(15) DEFAULT NULL,
  `col1` char(15) DEFAULT NULL,
  `col2` char(15) DEFAULT NULL,
  `col3` char(15) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `tbl2` (
  `UserID` char(15) DEFAULT NULL,
  `col4` char(15) DEFAULT NULL,
  `col5` char(15) DEFAULT NULL,
  `col6` char(15) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO tbl1
  (`UserID`, `col1`, `col2`, `col3`)
VALUES
  ('user1', 'one', 'two', 'three');

INSERT INTO tbl1
  (`UserID`, `col1`, `col2`, `col3`)
VALUES
  ('user1', 'oneone', 'twotwo', 'threethree');

INSERT INTO tbl2
  (`UserID`, `col4`, `col5`, `col6`)
VALUES
  ('user1', 'col4name', 'col5name', 'col6name');

Конечный результат, который я ищу, будет выглядеть после запроса mysql следующим образом.

CREATE TABLE `endresult` (
  `UserID` char(15) DEFAULT NULL,
  `col4name` char(15) DEFAULT NULL,
  `col5name` char(15) DEFAULT NULL,
  `col6name` char(15) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Вы увидите, что user1 имеет на tbl2 запись col4 "col4name", которая была добавлена ​​user1 для его / ее пользовательского имени для этого конкретного столбца. Теперь я хотел бы, чтобы эти имена пользовательских столбцов отображались так, как они отображаются в таблице «endresult».

Я знаю, что это было бы предпочтительно сделать в конце, используя php для отображения, но мне действительно нужно сделать это на стороне mysql. Еще раз спасибо

Ответы [ 3 ]

1 голос
/ 16 сентября 2009

Я думаю, что вы хотите, чтобы имя столбца определялось динамически на основе содержимого таблиц tbl1 и tbl2.

Это невозможно, самое близкое к этому - динамическое создание оператора SQL с различными псевдонимами для столбцов (на основе предыдущего запроса SQL, чтобы найти правильные значения). Это, конечно, будет ограничено именами для ОДНОГО данного пользователя, поскольку у нескольких пользователей могут быть конфликтующие имена, но запрос будет принимать только один псевдоним на столбец ... (Кстати, один, хотя и не основная причина, почему не может быть сделано непосредственно в SQL).

ПРИМЕЧАНИЕ РЕДАКТИРОВАНИЯ: Ответ Дэвида Андреса показывает один из способов выполнить такой двухэтапный запрос.

1 голос
/ 16 сентября 2009

Я думаю, что выполнение оператора SQL в виде строки (динамически) может быть вашим лучшим выбором. Пожалуйста, будьте осторожны в отношении внедрения SQL и данных, которые предполагается использовать в этом операторе SQL.

Что-то вроде:

SET @qry = (
            SELECT CONCAT('SELECT t1.userid, 
                           t1.col1 AS "', t2.col4, '", 
                           t1.col2 AS "', t2.col5, '",
                           t1.col3 AS "', t2.col6, '"
                    FROM tbl1 t1') AS QUERY_TEXT                      
            FROM tbl2 t2 
            WHERE t2.userid = @userId
           );
PREPARE stmt FROM @qry;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Этот запрос будет возвращать данные из tbl1, но col1, col2 и col3 имеют псевдонимы из значений в соответствующей записи tbl2 с учетом конкретного идентификатора пользователя @ userId.

В этом и заключается проблема, я не могу понять, что расширить в этом вопросе, чтобы он мог применяться к нескольким пользователям в одном операторе SELECT. Это имеет смысл, потому что невозможно правильно выстроить столбцы, когда они имеют разные имена (плюс, я считаю, что это невозможно сделать в SQL).

0 голосов
/ 16 сентября 2009

Это с другой доски .... Не знаете, как подать заявку в моей ситуации?

Может быть, что-то вроде этого (сделано для базы данных MySQL, вы должны изменить это для ваших объединений):

mysql> выберите пользователя, СЛУЧАЙ КОГДА user = 'root' THEN host WHEN user = 'drupal' THEN пароль КОНЕЦ ОТ пользователя WHERE user <> ''; + ------------------ + ------------------------------ ---------------------------------------- + | пользователь | СЛУЧАЙ КОГДА user = 'root' THEN host Когда user = 'drupal' THEN пароль END | + ------------------ + ------------------------------ ---------------------------------------- + | корень | местный хост | | корень | ноутбук | | корень | 127.0.0.1 | | debian-sys-maint | NULL | | друпал | * 7AFEAE5774E672996251E09B946CB3953FC67656 | | друпал | | + ------------------ + ------------------------------ ---------------------------------------- +

Вы должны сделать что-то вроде:

ВЫБРАТЬ .... ВКЛ tbl1 ПРИСОЕДИНИТЬСЯ к tbl2 ВКЛ tbl1.col1 = tbl2.col2 ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...