Intereting Posts
конвертировать дату datepicker в mysql date PHP AES шифрует / расшифровывает В чем смысл запускать Laravel с помощью команды «php artisan serve»? Условная проверка диапазона дат mysqli для печати цены в sql Как отслеживать страницу загрузки с помощью google-analytics и php? Определение языка PHP проверять текстовое поле при вводе php Отправить форму в div с ajax, вернуть php в div без обновления Почта PHP не отправляется по электронной почте Сохранение китайского символа в oracle с использованием ajax не работает PHP / MySQL. Существует ли функция mysql для определения того, существует ли хотя бы 2 определенных слова по меньшей мере в одном поле строки mysql передать массив из jQuery в PHP (и фактически перейти на страницу после отправки) Получить данные из файла JSON с помощью PHP Как отправлять данные из приложения iOS в базу данных MySQL? Моя контактная форма отправляет пустые сообщения body_messages

Оптимизируйте этот SQL-запрос

У меня есть SQL-запрос в цикле foreach. Иногда их может быть много, и я имею в виду много запросов, в зависимости от нескольких критериев, до 78 запросов.

Теперь я знаю, что преждевременная оптимизация является основной причиной всего зла, но я не хочу видеть 78 запросов – это просто не здорово.

Вот код:

$crumbs = explode(",", $user['data']['depts']); foreach ($crumbs as &$value) { $data = $db->query("SELECT id FROM tbl_depts WHERE id = '" . $value . "'"); $crumb = $data->fetch_assoc(); $dsn = $db->query("SELECT msg, datetime FROM tbl_motd WHERE deptid = '" . $value . "'"); $motd = $dsn->fetch_assoc(); if ($motd['msg'] != "") { <?php echo $motd['msg']; ?> } } 

Могу ли я сделать это лучше?

Solutions Collecting From Web of "Оптимизируйте этот SQL-запрос"

Используйте IN MySQL operator для поиска по набору значений для id :

 $ids = '"' . implode('", "',$crumbs) . '"'; $query1 = "SELECT id FROM tbl_depts WHERE id IN (" . $ids . ")"; $query2 = "SELECT msg, datetime FROM tbl_motd WHERE deptid IN (" . $ids . ")"; 

И поэтому вам не нужно будет извлекать все данные, которые вам нужны, используя цикл foreach , поэтому у вас будет всего 2 запроса вместо 78.

Пример. У меня есть таблица с именем table с 10 записями, которые являются идентификаторами: 1,2,3,4,5,6,7,8,9,10 (с автоинкрементами). Я знаю, что мне нужны записи с идентификаторами 1,5,8. Мой запрос будет:

 $sql = "SELECT * FROM `table` WHERE id in (1,5,8);"; 

И я не понимаю, зачем вам нужно использовать & operator в цикле foreach если вы не изменяете $crubms массивов $crubms .

Я думаю, это то, чего ты хочешь.

 SELECT msg, datetime FROM tbl_depts td INNER JOIN tbl_motd tm ON td.id = tm.deptid