Я пишу PHP-приложение, построенное на базе данных MySQL, для 5-6 приложений, разделяющих его Из-за этого я не могу изменить структуру базы данных, и я знаю, что многие из вас скажут сначала сделать это, но, к сожалению, я не могу.
Вот моя SQL скрипка схемы базы данных, запрос, который я использую, и желаемый результат:
http://sqlfiddle.com/#!2/de7493/1
Мое решение работает на этом примере базы данных, но на реальной производственной базе данных, где некоторые из этих таблиц имеют более 1 млн строк, когда я пытаюсь запустить ее, происходит сбой БД. Даже если я вырежу этот sql, чтобы выбрать только из 3-4 таблиц, он все равно потерпит крах. Может быть, это невозможно сделать, может быть, я делаю это неправильно. Вот что я должен сделать:
Я динамически получаю cpv_id от URL. В моем примере cpv_id равен 66113000. Исходя из этого значения, я должен выяснить, какие клубные предложения связаны с этим cpv_id. Затем, основываясь на этих предложениях, я должен выяснить, какие члены клуба имеют некоторые из этих предложений. (членами клуба являются компании). Затем, основываясь на идентификаторе члена клуба, я должен найти некоторую информацию о компании, которая является членом клуба, и среди этих данных мне нужно найти компанию special_id. И на основании этого special_id я должен читать отчеты компании.
Итак, в основном: на основе cpv_id я должен найти отчеты компании для компании, имеющей клубные предложения, связанные с этим идентификатором (просто так?). Как вы можете видеть из того, как мои таблицы связаны в SQLFiddle, мне нужно пройти через 6 таблиц, чтобы получить то, что мне действительно нужно. Еще раз, я не могу изменить структуру базы данных.
Это очень сложная вещь, я боюсь, что ты не поймешь, что мне нужно. Я надеюсь, что SQLFiddle поможет. И если у вас есть еще вопросы, пожалуйста, спросите меня.
Таким образом, учитывая, что мое решение, мой запрос, потерпело неудачу из-за сбоя базы данных, если я его запустил Есть ли способ получить желаемый результат? Могу ли я как-то оптимизировать этот запрос, или мне нужно написать какой-нибудь другой, или сделать что-нибудь еще? Я довольно растерян, так как мне никогда не приходилось углубляться и читать данные из стольких таблиц, чтобы получить желаемый результат.
Спасибо,
Анита
Это, кажется, делает то же самое:
SELECT DISTINCT company_report.*
FROM company_report,
company,
users,
club,
club_offer,
club_offer_cpv
WHERE company_report.company_special_id = company.special_id AND
company.id = users.company_id AND
users.id = club.users_id AND
club.id = club_offer.club_id AND
club_offer.id = club_offer_id AND
club_offer_cpv.cpv_id = 66113000
Другие люди предпочтут соединения, но я считаю, что это легче читать, и они эквивалентны. Это будет выглядеть примерно так:
SELECT DISTINCT company_report.*
FROM company_report
JOIN company ON company_report.company_special_id = company.special_id
JOIN users ON company.id = users.company_id
JOIN club ON users.id = club.users_id
JOIN club_offer ON club.id = club_offer.club_id
JOIN club_offer_cpv ON club_offer.id = club_offer_id AND
club_offer_cpv.cpv_id = 66113000
На самом деле, это не плохо, я имею в виду, я бы даже предпочел этот последний.
Добавьте индекс к вашим идентификаторам связей таблиц, затем попробуйте добавить одну за другой таблицу, используя внешние левые соединения