2009-09-16 37 views
0

昨天我錯誤地問了一個有錯誤列名的問題。 這造成了有趣的解決方案。所以我會在這裏再次提出同樣的問題,但這次我會直接使用mysql dump,所以不會有任何混淆。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對下它是由用戶1添加爲他COL4記錄「col4name」 tbl2的/她的自定義名稱爲特定列。現在我希望看到這些自定義列名顯示在「endresult」表中。

我知道這將是最好做最後使用PHP來顯示,但我真的需要在MySQL端做到這一點。 再次感謝

回答

1

我認爲執行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被賦予了特定的用戶ID @userId匹配tbl2的記錄中的值別名。

這就是問題所在,我似乎無法弄清楚在這個問題上擴展什麼,使它適用於單個SELECT語句中的多個用戶。這很有意義,因爲當它們被命名爲不同的時候,不可能正確排列列(我相信這在SQL中是不可能的)。

+0

,我認爲這應該工作,但是我的結束,我得到「未知列在 'COL4''字段列表「?任何想法爲什麼? – Ossi 2009-09-16 02:43:11

+0

在點」WHERE t2.userid = @userId「對查詢做了一個小的編輯這曾經是」WHERE t1.userid = @userId「t1不是查詢,嘗試自行運行select語句(整個SELECT CONCAT業務) – 2009-09-16 02:48:42

+0

它只需要用於單個用戶和他的記錄...... I希望在這個查詢的末尾添加像WHERE user ='user1'這樣的東西,如果我能使用它的話 – Ossi 2009-09-16 02:53:06

1

我認爲你想根據tbl1和tbl2的內容動態定義列名。

這是不可能的,最接近你可以得到這個,是動態地製作一個SQL語句與列的獨特的聯盟(基於以前的SQL查詢找到合適的值)。這當然會受限於一個給定用戶的名字,因爲幾個用戶可能有衝突的名字,但是查詢每列只會有一個別名......(這是順便說一句,儘管不是主要原因,爲什麼這可以不要直接在SQL中完成)。

編輯注: David Andres的回覆顯示了一種做這種兩步查詢的方法。

+0

你已經擊中了頭部:一次只限於一個用戶。 – 2009-09-16 02:40:16

0

這是來自其他董事會...... 不知道如何申請我的情況?

也許這樣的事情(對mysql數據庫做,你應該修改這個爲你的連接):

的mysql>選擇用戶,CASE WHEN用戶=「根」,那麼主機時,用戶=「Drupal的」,然後密碼END FROM用戶WHERE用戶<>''; + ------------------ + ----------------------------- ----------------------------------------- + |用戶| CASE WHEN user ='root'THEN host WHEN user ='drupal'THEN password END | + ------------------ + ----------------------------- ----------------------------------------- + | root | localhost | | root |筆記本| | root | 127.0.0。1 | | debian-sys-maint | NULL | | drupal | * 7AFEAE5774E672996251E09B946CB3953FC67656 | | drupal | | + ------------------ + ----------------------------- ----------------------------------------- +

你應該做點什麼像:

SELECT .... ON TBL1 JOIN tbl2的ON tbl1.col1 = tbl2.col2 ...