MySql Query с несколькими объединениями с огромными данными - PullRequest
0 голосов
/ 10 июня 2019

У меня есть три таблицы в базе данных

Таблица отзывов_ответов

    resp_id(Primary) | name | mobile | pnr | message | added_on

Таблица feedback_response_items

    feed_item_id | resp_id | qn_id | ans_id

Таблица обратной связи_ответов

    ans_id(Primary) | ans_desc | qn_id

Мне нужно отобразить все строки в таблице обратной связи , и каждая строка содержит 9 элементов в feedback_response_items , соответствующих первичному ключу таблицы feedback_responses , resp_id

Так что я получу ans_id по всем вопросам, на который я получу описание ответа в таблице feedback_answers

и запрос

$f=$db->Query("
        SELECT fr.resp_id, fr.name, fr.mobile, fr.pnr, fr.message,
        (SELECT ans_id FROM feedback_response_items fr1 WHERE fr.resp_id = fr1.resp_id  AND fr1.qn_id='1') AS qn1Ans,
        (SELECT ans_id FROM feedback_response_items fr2 WHERE fr.resp_id = fr2.resp_id  AND fr2.qn_id='2') AS qn2Ans,
        (SELECT ans_id FROM feedback_response_items fr3 WHERE fr.resp_id = fr3.resp_id  AND fr3.qn_id='3') AS qn3Ans,
        (SELECT ans_id FROM feedback_response_items fr4 WHERE fr.resp_id = fr4.resp_id  AND fr4.qn_id='4') AS qn4Ans,
        (SELECT ans_id FROM feedback_response_items fr5 WHERE fr.resp_id = fr5.resp_id  AND fr5.qn_id='5') AS qn5Ans,
        (SELECT ans_id FROM feedback_response_items fr6 WHERE fr.resp_id = fr6.resp_id  AND fr6.qn_id='6') AS qn6Ans,
        (SELECT ans_id FROM feedback_response_items fr7 WHERE fr.resp_id = fr7.resp_id  AND fr7.qn_id='7') AS qn7Ans,
        (SELECT ans_id FROM feedback_response_items fr8 WHERE fr.resp_id = fr8.resp_id  AND fr8.qn_id='8') AS qn8Ans,
        (SELECT ans_id FROM feedback_response_items fr10 WHERE fr.resp_id = fr10.resp_id  AND fr10.qn_id='10') AS qn10Ans
        FROM feedback_responses fr
        "); 

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

Ответы [ 2 ]

1 голос
/ 22 июня 2019

Я думаю, что если вы переместите свои подзапросы в операторе select и присоединитесь к таблице элементов, ваш запрос будет выполняться очень быстро!(кажется, что подзапросы выполняются для каждой строки, поэтому требуется время).Это будет работать:

SELECT fr.resp_id, fr.name, fr.mobile, fr.pnr, fr.message,
MAX(IF(fri.qn_id='1',ans_id,0)) AS qn1Ans,
MAX(IF(fri.qn_id='2',ans_id,0)) AS qn2Ans,
MAX(IF(fri.qn_id='3',ans_id,0)) AS qn3Ans,
MAX(IF(fri.qn_id='4',ans_id,0)) AS qn4Ans,
MAX(IF(fri.qn_id='5',ans_id,0)) AS qn5Ans,
MAX(IF(fri.qn_id='6',ans_id,0)) AS qn6Ans,
MAX(IF(fri.qn_id='7',ans_id,0)) AS qn7Ans,
MAX(IF(fri.qn_id='8',ans_id,0)) AS qn8Ans,
MAX(IF(fri.qn_id='10',ans_id,0)) AS qn10Ans,
FROM feedback_responses fr
JOIN feedback_response_items fri ON fr.resp_id = fri.resp_id 
GROUP BY fr.resp_id, fr.name, fr.mobile, fr.pnr, fr.message

Надеюсь, это поможет!

1 голос
/ 10 июня 2019

Это может быть не тот ответ, который полностью удовлетворит вас, потому что может потребоваться некоторое программирование:

Вы забыли указать, какие индексы вы указали для различных таблиц. Для таблицы feedback_response_items вы должны были определить индекс по крайней мере для столбца resp_id (и один для qn_id , вероятно, не повредит). Если нет, сделайте это и посмотрите, как это сокращает время выполнения.

Если вы уже определили индекс или определение индекса не улучшило время выполнения, вам нужно немного программировать. Ваш SQL должен быть:

SELECT fr.resp_id, fr.name, fr.mobile, fr.pnr, fr.message, fri.ans_id /*, fa.ans_desc */
FROM feedback_responses fr
JOIN feedback_response_items fri ON fr.resp_id = fri.resp_id    
                                    AND fri.qn_id IN ('1','2','3','4','5','6','7','8','10')
/* JOIN feedback_answers fa on fri.ans_id = fa.ans_id */
ORDER BY fri.qn_id
;

Удалите комментарии в приведенном выше SQL, чтобы также получить ответы. Теперь для каждого значения fr.resp_id будет возвращено 9 строк. Предполагается, что этот SQL будет выдан компьютерной программой, которая обработает группы из 9 строк и отобразит результаты, как вам нравится.

...