2015-02-12 30 views
0

不知何故我不喜歡我寫的以下請求,我覺得它有點難看,有沒有人有更好的方式來寫它,建議或意見?最好的方法來改善這個MySQL請求

DoSQL("SELECT A.`quotation_id`, A.`quotation_uid`, A.`quotation_ref`, A.`quotation_name`, A.`from_uid`, A.`to_uid`, A.`original_amount`, A.`direct_discount`, A.`status`, B.`user_email`, C.`ct_first_name`, C.`ct_last_name`, C.`ct_addr_line_a`, C.`ct_addr_line_b`, C.`postal_code`, D.`account_name`, E.`name` AS `City`, F.`name` AS `Country`, H.`name` AS `Region`, 
    (SELECT `user_email` FROM `"._MIKI_TABLE_PREF."miki_users` WHERE `user_uniq_id` = A.`to_uid`) AS `REC_EMAIL`, 
    (SELECT `ct_first_name` FROM `"._MIKI_TABLE_PREF."miki_contacts` WHERE `original_user_uid` = A.`to_uid`) AS `REC_FNAME`, 
    (SELECT `ct_last_name` FROM `"._MIKI_TABLE_PREF."miki_contacts` WHERE `original_user_uid` = A.`to_uid`) AS `REC_LNAME`, 
    (SELECT `ct_addr_line_a` FROM `"._MIKI_TABLE_PREF."miki_contacts` WHERE `original_user_uid` = A.`to_uid`) AS `REC_LINE_A`, 
    (SELECT `ct_addr_line_b` FROM `"._MIKI_TABLE_PREF."miki_contacts` WHERE `original_user_uid` = A.`to_uid`) AS `REC_LINE_B`, 
    (SELECT `postal_code` FROM `"._MIKI_TABLE_PREF."miki_contacts` WHERE `original_user_uid` = A.`to_uid`) AS `REC_PS_CODE`, 
    (SELECT I.`account_name` FROM `"._MIKI_TABLE_PREF."miki_accounts` I LEFT JOIN 
            `"._MIKI_TABLE_PREF."miki_contacts` J ON I.`account_uid` = J.`ct_account_uid` WHERE J.`original_user_uid` = A.`to_uid`) AS `REC_ACCOUNT`, 
    (SELECT J.`name` FROM `"._MIKI_TABLE_PREF."miki_contacts` I LEFT JOIN 
          `"._MIKI_TABLE_PREF."citynames` J ON J.`ID` = I.`city` 
    WHERE I.`original_user_uid` = A.`to_uid` AND J.`locale` = '".$_SESSION['lang']."') AS `REC_CITY`, 
    (SELECT J.`name` FROM `"._MIKI_TABLE_PREF."miki_contacts` I LEFT JOIN 
          `"._MIKI_TABLE_PREF."countrynames` J ON J.`code` = I.`country` 
    WHERE I.`original_user_uid` = A.`to_uid` AND J.`locale` = '".$_SESSION['lang']."') AS `REC_COUNTRY`, 
    (SELECT L.`name` FROM `"._MIKI_TABLE_PREF."miki_contacts` I LEFT JOIN 
          `"._MIKI_TABLE_PREF."regions` J ON J.`code` = I.`ct_region` LEFT JOIN 
          `"._MIKI_TABLE_PREF."regions` K on K.`ID` = J.`ID` LEFT JOIN 
          `"._MIKI_TABLE_PREF."regionnames` L on L.`ID` = J.`ID` 
    WHERE I.`original_user_uid` = A.`to_uid` AND K.`country` = I.`country` AND L.`locale` = '".$_SESSION['lang']."') AS `REC_REGION` 
    FROM `"._MIKI_TABLE_PREF."miki_jaga_quotations` A LEFT JOIN 
    `"._MIKI_TABLE_PREF."miki_users` B on B.`user_uniq_id` = A.`from_uid` LEFT JOIN 
    `"._MIKI_TABLE_PREF."miki_contacts` C on B.`user_uniq_id` = C.`original_user_uid` LEFT JOIN 
    `"._MIKI_TABLE_PREF."miki_accounts` D on D.`account_uid` = C.`ct_account_uid` LEFT JOIN 
    `"._MIKI_TABLE_PREF."citynames` E ON E.`ID` = C.`city` LEFT JOIN 
    `"._MIKI_TABLE_PREF."countrynames` F on F.`code` = C.`country` LEFT JOIN 
    `"._MIKI_TABLE_PREF."regions` G on G.`code` = C.`ct_region` LEFT JOIN 
    `"._MIKI_TABLE_PREF."regions` H on H.`ID` = G.`ID` WHERE A.`quotation_uid` = '".$_GET['quid']."' AND B.`user_uniq_id` = '".htmlentities($_SESSION['user_uniq_id'])."' AND E.`locale` = '".$_SESSION['lang']."' AND F.`locale` = '".$_SESSION['lang']."' AND H.`country` = C.`country` GROUP BY A.`quotation_id`;", 'get_quotation_from_info'); 

不介意我直接傳遞給請求的變量,它們已經在代碼的前面進行了驗證。

在此先感謝。

回答

0

構建最具體的查詢,選擇最小的一組數據,並從中解決這些問題,以便這些連接在性能上不會令人感到恐慌。

爲什麼不重新開始篩選值,選擇Biggest表,編寫一個查詢以獲得您想要的最小集合。

從那裏,再次建立...你應該永遠不會做每個字段的查詢!

+0

嘿派桑科,我沒有看到你試圖解開那個爛攤子,但你希望我應該撤銷你的禁令?你真的不相信我的回答有幫助嗎? – user4515803 2015-02-12 05:29:21

+0

你禁止我回答,所以我認爲你應該這樣做。建立這些表,編寫該查詢。爲他的表提供正確的查詢。你說我的意見不好,讓我們看看你的具體答案班曼先生。 – user4515803 2015-02-12 05:33:26

+0

Paisanco先生決定這個用戶必須得到一個完整的答案,我纔不會被禁止。精細。我不幹了。他是否對所有問題都這樣做?那是多少工作?這不是僅僅因爲他不同意的評論而被禁止的一個不好的例子嗎? Paisanco是否更喜歡那些一般註定永遠得不到答案的人仍然得不到答案或評論?他會填補空白嗎?他甚至知道嗎?回到matlab和你的Java。讓我知道還有誰會因爲這個特殊的noob sql問題而煩惱MS Access查詢生成器的結果? – user4515803 2015-02-12 05:48:44

0

因此,你建議做出多個請求,而不是隻有一個與子請求獲得所有結果?

「你應該永遠不要做每個字段的查詢!」

我知道,但是我找不到一個更好的方法(除了多個請求)來做到這一點。

相關問題