2013-08-20 34 views
0

我有幾個查詢具有相同的過濾器。檢索表別名

例如:

過濾:

$criteria = "AND id_student = 1 AND id_major = 2 "; 

查詢1:

$query1 = "SELECT * FROM student AS t0 
LEFT JOIN major AS t1 ON t0.id_major = t1.id 
WHERE 1=1 "; 

問題2:

$query2 = "SELECT * FROM lecturer AS t0 
LEFT JOIN major AS t1 ON t0.id_major = t1.id 
LEFT JOIN student AS t2 ON t2.id_major = t1.id 
WHERE 1=1 " 

應當運行作爲

$query1.$criteria 

$query2.$criteria 

正如你所看到的,這將產生一個查詢錯誤,因爲id_major是模糊的。

我的問題是,這個查詢在數量上非常大,所以我寧願不要硬編碼並單獨更改$ criteria和$ query。

我試圖改變$標準納入

$criteria = "AND student.id_student = 1 AND major.id_major = 2 "; 

但它確實沒有更好的,它給了我的「你的意思是T0」,「你的意思是T2」的錯誤,等等。

那麼,我可以做一些類似的事情,獲得​​一個表的別名?所以我可以把它放在$標準中

$criteria = "AND (get-alias-code).id_student = 1 AND (get-alias-code).id_major = 2 "; 

或者其他方法?

我不是這個程序的主要開發人員,只是一個錯誤修復程序,所以我不能改變這個程序的大部分內容(因爲這些查詢可能會影響另一個頁面)。

+1

你說你是一個bug修復器 –

+0

你在那些查詢中的WHERE子句...... WHERE 1 = 1',真的嗎?我知道的唯一情況是盲目的SQL注入攻擊。 – ciruvan

+0

你可以使用's as'作爲別名,'m'作爲別名,並且將$ criteria寫爲's.id_student = 1和m.id_major = 2',或者根本不使用別名而使用$ criteria,比如'student .id_student = 1 AND major.id_major = 2' –

回答

0

使用您對已經在你的表的別名,而設定的標準是

$criteria = "AND t0.`id_student`='1' AND t1.`id_major`='2' "; 

我強烈建議使用backtics和扁蝨,以及,它可以幫助避免與表或字段名滑稽的失誤,如「訂單「:)

然後,所有你需要確保的是,需要適用的標準表獲得正確的別名每次

編輯: 嗯......或者,你可以從所有查詢刪除走樣。 我真的不認爲有MySQL的功能來獲取表的別名。你可以運行一個字符串分析器代碼片段來找到它們(知道所有的表名,它可能不是很難做到),但這看起來像一個非常醜陋的解決方案恕我直言。

+0

問題是,存在不具有相同別名的查詢...如果它們是相同的,我不會問這個問題,不是嗎?不管怎麼說,還是要謝謝你。 –

+0

因此,除編輯所有這些變量之外真的沒有其他解決方法嗎? –

+0

好吧,我很遺憾不知道,對不起。 –

0

我不知道離開來處理它的SQL,但你可以處理它在陣列例如

$alias[1]["student"] = "t0"; // it means on query 1 your alias for student is t0 

現在您可以在過濾器中使用這個變量

$criteria = "AND ".$alias[1]["student"].".id_student = 1 AND ".$alias[1]["major"].".id_major = 2 "; 

我想它是在不改變所有查詢的情況下更改過濾器的快速方法之一。 希望它有助於

0

包住整個事情在這樣一個外部查詢:

"SELECT * FROM (".$query1.") a ".$criteria; 

假設,當然,原來的查詢沒有使用相同的名稱創建多個列,你現在可以參考它們不別名。