Optimizar esta consulta SQL

Tengo una consulta SQL dentro de un ciclo foreach. A veces puede haber muchas, y me refiero a muchas consultas que hacer, dependiendo de varios criterios, hasta 78 consultas potencialmente.

Ahora, sé que la optimización prematura es la causa raíz de todo mal, pero no quiero ver 78 consultas, simplemente no es saludable.

Aquí está el código:

$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'] != "") {  } } 

¿Puedo hacerlo mejor?

Utilice el IN MySQL operator para buscar sobre un conjunto de valores para 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 . ")"; 

Por lo tanto, no necesitará recuperar todos los datos que necesita utilizando el bucle foreach , por lo que tendrá solo 2 consultas en lugar de 78.

Ejemplo: Tengo una tabla llamada table con 10 registros cuyos identificadores son: 1,2,3,4,5,6,7,8,9,10 (autoincrementado). Sé que necesito registros con identificadores 1,5,8. Mi consulta será:

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

Y no entiendo por qué necesita usar & operador en el bucle foreach si no modifica los valores de matrices $crubms .

Creo que esto es querer lo que quieres.

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