2015-02-12 3 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 table, написать один запрос, чтобы получить тот самый маленький набор того, что вы хотите.

Оттуда снова создайте ... Вы никогда не должны делать запрос в поле!

+0

Эй, Пайсанко, я не вижу, чтобы вы пытались расслабиться в этом беспорядке, но вы ожидаете, что я должен отменить ваш запрет? Вы действительно не верите, что мой ответ полезен? – user4515803

+0

Вы запретили мне отвечать, поэтому я думаю, вы должны это сделать. Создайте эти таблицы, напишите этот запрос. Предоставьте правильный запрос для его таблиц. Вы сказали, что мое мнение не подходит, поэтому давайте посмотрим на ваш конкретный ответ, г-н запрет человека. – user4515803

+0

Г-н Paisanco решил, что этот пользователь должен получить законченный ответ, чтобы я не был запрещен. Хорошо. С меня хватит. Он делает это по всем вопросам? Сколько это стоит? Разве этот случай не является плохим примером для запрета только из-за некоторых комментариев, с которыми он не соглашался? Предполагает ли Paisanco, что люди, у которых обычно возникают вопросы, которые никогда не получат ответа, не получают ответа или комментариев? Он заполнит пустоту? Он даже знает? Вернитесь к Matlab и вашей java. Покажите мне, кто еще будет беспокоиться об этом конкретном вопросе noob sql, без сомнения, в результате создания запроса MS Access? – user4515803

0

Так вы рекомендуете сделать несколько запросов, а не только один с подзапросом, чтобы получить все результаты?

«Вы никогда не должны делать запрос за поле!»

Я знаю, что, однако, я не мог найти лучший способ (за исключением нескольких запросов), чтобы сделать это.