2012-03-06 37 views
0

我有一個遺留的網站,我正在爲我的大學保持和運行,我遇到了一些障礙。找出從哪個列MySQL數據來自

我正在建立一個Rec信函審查系統,在這個系統中,院長可以進來並檢查一封信是否好,或者是否需要重新編寫。我的問題如下:

數據庫根本沒有標準化,大約有120列。 我已經得到了所有需要複習他們信件的學生,但我無法知道它來自哪一欄(如Rec1,Rec2,Rec3 ... Rec10)。不知道哪一列引發了警報本身,我無法有效地鏈接到它。

我試過使用mysql_fetch_field,但我不能完全弄清楚如何將它與SELECT結合起來,它將它限制到包含推薦者ID的字段(這將在正確的列中,因此將我的信息需要)。

任何幫助,非常感謝。如果您需要更多的細節,請在下面提問。謝謝。

-samuel

+1

返回並修復數據庫模式。每一個解決方案都會將痘痘添加到你的疣中:-) – paxdiablo 2012-03-06 05:11:23

+0

我不知道它D:這個東西是由3個不同的人建造了3年,所有人都通過構建它來學會編碼。然後我學會了對它進行編碼調試。我很樂意粉碎這個東西並且正確地重建它,但是考慮到我的時間限制,它確實是不可能的。 hackathon2012。 – samuel 2012-03-06 05:28:58

回答

0

我試着用的mysql_fetch_field,

嘗試使用mysql_fetch_assoc()

+0

是否會返回有關數據來自哪一列的信息?我在php手冊中找不到任何有關此類魔術的參考。 – samuel 2012-03-06 05:29:47

+0

哦真的嗎?可能是我不能得到你的問題,但對我來說,這個功能的唯一目的是告訴你每個檢索的數據行的列名稱 – 2012-03-06 05:34:44

+0

是的,問題是,我需要列觸發行的列名稱是拉到使數據真正有用。 – samuel 2012-03-06 06:00:00

0

考慮:

CREATE TABLE `test_flat` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(100) DEFAULT NULL, 
    `rec1` varchar(100) DEFAULT NULL, 
    `rec2` varchar(100) DEFAULT NULL, 
    `rec3` varchar(100) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
); 

隨着初始數據:

INSERT INTO test_flat VALUES (NULL, 'name 0', '1', '2', '3'); 
INSERT INTO test_flat VALUES (NULL, 'name 1', '11', '12', '13'); 

SELECT * FROM test_flat; 
+----+--------+------+------+------+ 
| id | name | rec1 | rec2 | rec3 | 
+----+--------+------+------+------+ 
| 1 | name 0 | 1 | 2 | 3 | 
| 2 | name 1 | 11 | 12 | 13 | 
+----+--------+------+------+------+ 

您可以:

SELECT *, IF (rec1 = '2', 'rec1', IF (rec2 = '2', 'rec2', IF (rec3 = 'rec3', 'rec3', ''))) AS matched FROM test_flat WHERE rec1 = '2' or rec2 = '2' or rec3 = '2'; 
+----+------+------+------+------+---------+ 
| id | name | rec1 | rec2 | rec3 | matched | 
+----+------+------+------+------+---------+ 
| 1 | name | 1 | 2 | 3 | rec2 | 
+----+------+------+------+------+---------+ 
0

Basicly你按照你的常識告訴我們:

$value = 'idnumber'; 

$query = query("SELECT Rec1, Rec2, Rec3 FROM table WHERE {$value} IN (Rec1, Rec2, Rec3)"); 
$row = mysql_fetch_assoc($query); 

foreach(array_keys($row) as $h) 
    if ($row[$h] == $value) { 
     $column = $h; 
     break; 
    } 

現在你有你的$column

如果有很多列,你可以這樣做:

$arr_cols = array(); 
foreach(range(1, 20) as $i) 
    $arr_cols[] = "Rec{$i}"; 

$str_cols = implode(', ', $arr_cols); 

$query = query("SELECT {$str_cols} FROM table WHERE {$value} IN ({$str_cols})"); 
0

如果是我,我會忍不住來解決現有的爛攤子。作爲臨時措施:

CREATE VIEW norm_rec AS 
SELECT t1.id, 
     'rec1' AS src_col, 
     t1.rec1 as rec 
FROM yourtable t1 
UNION 
SELECT t2.id, 
     'rec2' AS src_col, 
     t2.rec2 as rec 
FROM yourtable t2 
UNION 
SELECT t3.id, 
     'rec3' AS src_col, 
     t3.rec3 as rec 
FROM yourtable t3 
.... 

根據數據如何更改,物化視圖會產生很多意義。

相關問題