#mysql
#mysql
Вопрос:
Я ищу более эффективный способ написания этого запроса, который отображает мета — значения для заказа в одной строке. Я сам не могу придумать решение, но прежде чем перепроектировать базу данных, я хотел бы узнать, есть ли у кого-нибудь идеи, как избежать 11 ВНУТРЕННИХ соединений. Вот мой запрос, который в настоящее время занимает 20 секунд для загрузки одного результата (что, очевидно, непрактично).:
SELECT o1.order_id, o1.order_status AS 'Order Status', m3.meta_value AS 'UOP Order Status', m4.meta_value AS 'UOP Registration Date', m5.meta_value AS 'UOP Banner Registration', m6.meta_value AS 'UOP Banner Date', m7.meta_value AS 'Course Completion Date', m8.meta_value AS 'Course Grade', m9.meta_value AS 'Grade Submission Date', m1.meta_value AS 'First Name', m2.meta_value AS 'Last Name', o1.order_date AS 'Order Date', m10.meta_value, m11.meta_value, o1.partner_id AS 'Source' FROM partner_orders o1 INNER JOIN partner_order_meta m1 ON (o1.order_id = m1.order_id) INNER JOIN partner_order_meta m2 ON (o1.order_id = m2.order_id) INNER JOIN partner_order_meta m3 ON (o1.order_id = m3.order_id) INNER JOIN partner_order_meta m4 ON (o1.order_id = m4.order_id) INNER JOIN partner_order_meta m5 ON (o1.order_id = m5.order_id) INNER JOIN partner_order_meta m6 ON (o1.order_id = m6.order_id) INNER JOIN partner_order_meta m7 ON (o1.order_id = m7.order_id) INNER JOIN partner_order_meta m8 ON (o1.order_id = m8.order_id) INNER JOIN partner_order_meta m9 ON (o1.order_id = m9.order_id) INNER JOIN partner_order_meta m10 ON (o1.order_id = m10.order_id) INNER JOIN partner_order_meta m11 ON (o1.order_id = m11.order_id) WHERE m1.meta_key = 'First Name' AND m2.meta_key = 'Last Name' AND m3.meta_key = 'uop_order_status' AND m4.meta_key = 'uop_registration_date' AND m5.meta_key = 'uop_banner_registration' AND m6.meta_key = 'uop_banner_registration_date' AND m7.meta_key = 'course_completion_date' AND m8.meta_key = 'course_grade' AND m9.meta_key = 'grade_submission_date' AND m10.meta_key = 'Course Number' AND m11.meta_key = 'Course Title';
Ответ №1:
Используйте группировку:
SELECT o1.order_id, o1.order_status AS `Order Status`, MAX(IF(m.meta_key = 'First Name', m.meta_value, NULL)) AS `First Name`, MAX(IF(m.meta_key = 'Last Name', m.meta_value, NULL)) AS `Last Name`, ... FROM partner_orders AS o1 JOIN partner_order_meta AS m ON o1.order_id = m.order_id GROUP BY o1.order_id