改进此MySQL请求的最佳方法

时间:2015-02-12 03:17:52

标签: mysql request long-integer

不知怎的,我真的不喜欢我写的以下请求,我发现它有点难看,有没有人有更好的方法来写它,建议或评论?

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');

不介意我直接传递给请求的变量,它们已经在代码中得到了验证。

提前致谢。

2 个答案:

答案 0 :(得分:0)

构建最具体的查询,选择最小的数据集并从中解决,这样这些连接在性能上并不可怕。

为什么不重新开始使用您要过滤的值,选择Biggest表,编写一个查询以获得您想要的最小值。

从那里再次构建......你永远不应该每个字段进行查询!

答案 1 :(得分:0)

所以你建议多个请求,而不是只有一个请求获得所有结果?

"你永远不应该对每个字段进行查询!"

我知道,但是我无法找到更好的方法(除了多个请求)。