0 Пользователей и 1 Гость просматривают эту тему.
  • 5 Ответов
  • 172 Просмотров
*

goga_pgasovav

  • Захожу иногда
  • 323
  • 4 / 0
  • Внимательный джумловод
Всем привет!
Прошу помощи у гуру PHP в оптимизации запроса к базе данных.
Сейчас у меня как-то так вышло:

Код
<?php
$db = &JFactory::getDBO();
$tstsmls = $db->setQuery("SELECT SubmissionId FROM #__rsform_submissions WHERE UserId = 1")->loadColumn();
foreach  ($tstsmls as $tstsml) { ?>
                <div class="testimonial">
                    <div class="name"><?php echo $db->setQuery("SELECT FieldValue FROM #__rsform_submission_values WHERE SubmissionId = '$tstsml' AND FormID = 3 AND FieldName = 'Fullname'")->loadResult(); ?></div>
                    <div class="city"><?php echo $db->setQuery("SELECT FieldValue FROM #__rsform_submission_values WHERE SubmissionId = '$tstsml' AND FormID = 3 AND FieldName = 'City'")->loadResult(); ?></div>
                    <div class="message"><?php echo $db->setQuery("SELECT FieldValue FROM #__rsform_submission_values WHERE SubmissionId = '$tstsml' AND FormID = 3 AND FieldName = 'Message'")->loadResult(); ?></div>
                </div>
<?php } ?>

Объясню.. Хочу выводить данные, отправдленные с формы сайта (отзывы).
Сначала я делаю запрос к таблице, в которой хранятся ID отзывов, и получаю SubmissionId
Зная ID я хочу получить значения из другой таблицы (Имя, город, отзыв).
И получается так, что мне приходится для каждого отзыва делать ещё аж по три запроса!
В колонке FieldName хранится имя поля, а в соседней колонке FieldValue значение этого поля...
Как бы мне все три значения получить в одном запросе, а потом (возможно с помощью json_decode) выводить их в нужном месте?  :dry:

Заранее благодарю всех откликнувшихся  !!!???!!!
« Последнее редактирование: 07.12.2020, 18:46:47 от goga_pgasovav »
*

rsn

  • Давно я тут
  • 516
  • 34 / 3
Re: Оптимизировать getDBO запрос
« Ответ #1 : 07.12.2020, 21:43:50 »
Думаю, Вам стоит оптимизировать не только запрос, но и подход.
В одном запросе получить все данные, а потом перебором foreach брать нужные.
На саму таблицу RS я не смотрел, но судя по Вашему коду, попробуйте примерно такой запрос (даю с 2 джоинами, чтобы 3-й Вы сами добавили):

Код
SELECT s.SubmissionId, v1.FieldValue AS Fullname, v2.FieldValue AS City
FROM #__rsform_submissions s
LEFT JOIN #__rsform_submission_values v1 USING(SubmissionId)
LEFT JOIN #__rsform_submission_values v2 USING(SubmissionId)
WHERE
    s.UserId = 1
    AND v1.FormID = 3
    AND v1.FieldName = 'Fullname'
    AND v2.FormID = 3
    AND v2.FieldName = 'City'
ORDER BY s.SubmissionId ASC

И метод потом loadObjectList

P.S. Не совсем понял Ваше условие UserId=1, но оставил, раз есть в исходном примере.
Возможно, будет интересно: Интеграция с Ozon
*

goga_pgasovav

  • Захожу иногда
  • 323
  • 4 / 0
  • Внимательный джумловод
Re: Оптимизировать getDBO запрос
« Ответ #2 : 07.12.2020, 22:24:46 »
Невероятно!  :D Вот это код... Я бы до такого никогда не додумался.
Вместо постоянного долбления БД запросами, получается всего один запрос!  :o
Нижайший поклон вам! Всё получилось!

Для тех, у кого будут возникать подобные вопросы, добавлю код, который поможет выводить данные.

Код
$tstsmls = json_decode(json_encode($db->loadObjectList()), true);
foreach  ($tstsmls as $tstsml) {
    echo $tstsml['Fullname'];
    echo $tstsml['City'];
}

Ну и так далее.
Третий параметр я так же добавил в своём коде, как и разметку нужную.
*

rsn

  • Давно я тут
  • 516
  • 34 / 3
Re: Оптимизировать getDBO запрос
« Ответ #3 : 07.12.2020, 23:29:27 »
 ;)

Возможно, в json и обратно - лишнее.
Если это для того, чтобы был список массивов, в не объектов,
тогда, пожалуй, проще просто использовать loadAssocList(), вместо loadObjectList().
Возможно, будет интересно: Интеграция с Ozon
*

draff

  • Гуру
  • 5361
  • 381 / 7
  • ищу работу
Re: Оптимизировать getDBO запрос
« Ответ #4 : 08.12.2020, 04:47:49 »
Возможно, в json и обратно - лишнее.
А так ?
Код
$tstsmls = $db->loadObjectList();
foreach  ($tstsmls as $tstsml) {
    echo $tstsml->Fullname;
    echo $tstsml->City;
}
*

goga_pgasovav

  • Захожу иногда
  • 323
  • 4 / 0
  • Внимательный джумловод
Re: Оптимизировать getDBO запрос
« Ответ #5 : 10.12.2020, 12:36:56 »
;)

Возможно, в json и обратно - лишнее.
Если это для того, чтобы был список массивов, в не объектов,
тогда, пожалуй, проще просто использовать loadAssocList(), вместо loadObjectList().

Вы абсолютно правы! Именно loadAssocList() сработало. Я понимал что туда сюда в json гонять как-то неправильно, но о loadAssocList никогда не слышал  ^-^

А так ?
Код
$tstsmls = $db->loadObjectList();
foreach  ($tstsmls as $tstsml) {
    echo $tstsml->Fullname;
    echo $tstsml->City;
}

Это первое, что я попробовал, но оно не сработало. Ошибку выдаёт Joomla: 0 - Cannot use object of type stdClass as array
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[решено] создать MySQL-запрос по красоте :)

Автор effrit

Ответов: 13
Просмотров: 633
Последний ответ 30.09.2017, 16:58:21
от effrit
Запрос в бд

Автор sSeifeRr

Ответов: 7
Просмотров: 615
Последний ответ 02.08.2017, 18:28:19
от sSeifeRr
sql запрос из материла Joomla

Автор xak400

Ответов: 1
Просмотров: 588
Последний ответ 30.06.2017, 09:45:32
от SmokerMan
Как составить запрос с выбором данных из строки с разделителем?

Автор denism300

Ответов: 34
Просмотров: 1279
Последний ответ 20.11.2016, 21:48:07
от robert
Как после сохранения заменить текст/дескрипшн (сделать sql запрос)?

Автор Karyuudo

Ответов: 2
Просмотров: 727
Последний ответ 09.09.2015, 13:41:54
от Karyuudo