У меня есть 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']; ?> } }
Могу ли я сделать это лучше?
Используйте 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