59 / 59 / 16
Регистрация: 14.06.2010
Сообщений: 1,190
Записей в блоге: 5
1

Сложный запрос MySQL

14.02.2015, 04:47. Показов 1030. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как в одном запросе извлечь данные о неких элементах в таблице, и попутно с других таблиц прицепить к ним строки соответствующие по идентификатору. Суть на примере:
Я извлекаю данные о товарах:
PHP
1
2
3
        $q = $dbh->prepare("select * from products where section=?");
        $q->execute(array('fruits'));
        $res = $q->fethAll();
Но для того чтобы извлечь для каждого товара доп. данные с других таблиц, мне приходится массив $res перебирать циклом и делать много запросов к ост таблицам:
PHP
1
2
3
4
5
6
7
8
        $q = $dbh->prepare("select * from comments where id=?");
        $q->execute(array($res[$i]['id']));
        $res[$i]['comments'] = $q->fethAll();
       
        $q = $dbh->prepare("select * from likes where id=?");
        $q->execute(array($res[$i]['id']));
        $res[$i]['likes'] = $q->fethAll();
// .... и т.д.
Как это чётенько и компактно, по возможности максимум снизив нагрузку на сервер, сделать в одном запросе?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2015, 04:47
Ответы с готовыми решениями:

сложный запрос к БД (MySQL)
Помогите сформировать запрос. есть бд. в ней с десяток таблиц. в каждой таблице есть поле date. ...

Сложный mysql запрос
Здравствуйте дорогие мои друзья. Есть таблица где данные берутся из mysql и она состоит...

mysql выполнить сложный запрос
Вообщем есть масив такого вида Array ( => Array ( => 0 ...

Оптимизировать сложный запрос php+mysql
Ребят сложный запрос к базе(сильно грузит сервер)... Сам по себе запрос не очень(не я его делал),...

8
Superposition
950 / 615 / 256
Регистрация: 27.10.2013
Сообщений: 2,083
14.02.2015, 05:27 2
Субзапрос чьтоле? select id from a where id = (select id from b)
0
59 / 59 / 16
Регистрация: 14.06.2010
Сообщений: 1,190
Записей в блоге: 5
14.02.2015, 09:44  [ТС] 3
Padimanskas, думаю что то вроде JOIN нужно
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
14.02.2015, 10:45 4
Sanu0074, так?

SQL
1
2
3
4
5
6
SELECT `products`.*, `comments`.*, `likes`.* FROM `products`
LEFT JOIN `comments`
    ON( `comments`.`id`=`products`.`id` )
LEFT JOIN `likes`
    ON( `likes`.`id`=`products`.`id` )
WHERE `products`.`section`=?
1
59 / 59 / 16
Регистрация: 14.06.2010
Сообщений: 1,190
Записей в блоге: 5
14.02.2015, 15:00  [ТС] 5
lyod, да похоже на то. А на сколько приблизительно, в теории, в процентном соотношении этот запрос производительнее примера в шапке?
0
Эксперт PHP
5753 / 4133 / 1507
Регистрация: 06.01.2011
Сообщений: 11,276
14.02.2015, 15:13 6
Цитата Сообщение от Sanu0074 Посмотреть сообщение
А на сколько приблизительно, в теории, в процентном соотношении этот запрос производительнее примера в шапке?
Вот на это ответить не могу. Никогда не сравнивал подобное. Но представьте, что у Вас в таблице products 300 записей. Значит будет 600 запросов для выборки данных из таблиц comments и likes. Итого 601 запрос вместе с выборкой из products. А так - один. Один запрос явно лучше. А сколько mysql съест ресурсов при JOIN'ах - без понятия.
1
91 / 91 / 13
Регистрация: 14.07.2012
Сообщений: 539
15.02.2015, 12:33 7
Sanu0074, внутренние команды самого СКЛ сервера выполняются намного быстрей чем на ПХП. Они же для этого и предназначены. Чеще всего, mysql тотже вешают на отдельный сервер, чтобы не нагружать остальной. Объяснять дальше, что лучше?
1
59 / 59 / 16
Регистрация: 14.06.2010
Сообщений: 1,190
Записей в блоге: 5
16.02.2015, 03:22  [ТС] 8
pyramida, всё ясно) спасибо

Добавлено через 10 часов 55 минут
А если вариант, в котором comments и likes будут в таблице products, просто поле section у них будет = comments и likes соответственно, т.е. чтоб их извлечь нужно выполнить запрос:
Код
select from products where section=likes //....
Получается нужно делать так:
Код
$q = $dbh->prepare("select * from products where section=comments AND product_id=?");
        $q->execute(array($res[$i]['id']));
        $res[$i]['comments'] = $q->fethAll();
       
        $q = $dbh->prepare("select * from products where section=likes AND product_id=?");
        $q->execute(array($res[$i]['id']));
        $res[$i]['likes'] = $q->fethAll();
пример тупой, понимаю, но допустим такая ситуация, то как сделать все в одном сложном запросе?
нужно делать JOIN той же таблицы (работать будет)? это правильно?
0
91 / 91 / 13
Регистрация: 14.07.2012
Сообщений: 539
16.02.2015, 05:22 9
Есть такая функция, union называется
0
16.02.2015, 05:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2015, 05:22
Помогаю со студенческими работами здесь

Создать сложный запрос mysql wordpress
Не могли бы вы помочь мне переделать сложный запрос к базе данных с подсчетом постов? Ситуация...

Сложный запрос к БД
Всем привет. Подскажите пожалуйста как составить запрос к БД вот такого вида: чтобы в ответ...

Сложный запрос
Помогите прочитать код , совсем не могу понять как проходит проверка ответа. quest.php <? ...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru