update_batch update query not left example batch php mysql codeigniter join

php - query - update codeigniter example



IncorporaciĆ³n avanzada de MySQL. AceleraciĆ³n de la consulta (3)

Tengo una lista de usuarios en mi aplicación php (usando codeigniter). Cada usuario puede haber completado un formulario con aproximadamente 1000 campos totales. La estructura se ve similar a esto:

usuarios

id|username|...

completed_form_fields

id|formid|userid|fieldkey|data

donde la clave de campo es solo una clave única para ese campo de formulario en particular, es decir: "primer nombre"

Tengo una página de búsqueda de usuarios donde las personas pueden filtrar usuarios específicos por los campos que eligen (color de ojos, raza, sexo ...) Luego tengo que mostrar estos campos para que me encantaría (y actualmente tengo) un resultado como este:

$filteredmembers = array( [0] = Object( [id] => 1 [username] => kilrizzy ... [fields] => Array( [fname] => Jeff [gender] => Male ...

Actualmente, mi script obviamente está demorando desde que realizo una consulta a todos los miembros que completaron este formulario, luego recorro cada uno de ellos para consultar todos sus campos. ENTONCES los filtra según los criterios + página / desplazamiento.

Sé que debe haber una forma de unirlos en una consulta con la que no estoy familiarizado

Versión simplificada de mi código muy lento:

function get_members(){ $this->db->select(''u.*''); $this->db->from(''users AS u''); $query = $this->db->get(); if ($query->num_rows() > 0){ $members = $query->result(); //Get fields from each user foreach($members as $mk => $mv){ $fields = $this->get_form_fields($mv->id,1,true); $members[$mk]->fields = $fields; } return $members; }else{ return false; } } function get_form_fields($uid,$form,$values=false){ $this->db->where(''user'', $uid); $this->db->where(''form'', $form); $query = $this->db->get(''form_fields''); if ($query->num_rows() > 0){ $result = $query->result(); return $result; }else{ return false; } }


Hay una manera, pero se vuelve costosa cuanto más se agreguen los campos. Lo mismo ocurre con muchos CMS que eligen almacenar datos de usuario adicionales en esa forma.

Puede obtener un SQL de búsqueda que funcione usando esto:

SELECT users.*, firstname.data AS firstname, lastname.data AS lastname, eyecolor.data AS eyecolor, FROM users LEFT JOIN completed_form_fields AS firstname ON firstname.userid = users.id AND firstname.fieldkey = "firstname" LEFT JOIN completed_form_fields AS lastname ON lastname.userid = users.id AND lastname.fieldkey = "lastname" LEFT JOIN completed_form_fields AS eyecolor ON eyecolor.userid = users.id AND eyecolor.fieldkey = "eyecolor" WHERE firstname.data LIKE ''%searchdata%'' OR lastname.data LIKE ''%searchdata%'' OR eyecolor.data LIKE ''%searchdata%''

Este método se vuelve muy caro para el servidor MySQL cuanto más agregue tablas. Por lo tanto, recomendaría no ir más de 10-15 uniones como esa y, una vez más, lo perfilaría para asegurarme.


No estoy seguro de entender completamente el problema. Puede usar una única consulta para obtener todos los usuarios y todos sus campos (básicamente, esto es lo que sugirió Philip):

SELECT u.username, f.* FROM user AS u INNER JOIN completed_form_fields AS f ON f.userid = u.id ORDER BY u.id, f.fieldkey

Para filtrar los resultados, agregue una cláusula WHERE con las condiciones. Por ejemplo, para obtener solo datos de las fieldkey de fieldkey s ''k1'', ''k2'' y ''k3'':

SELECT u.username, f.* FROM user AS u INNER JOIN completed_form_fields AS f ON f.userid = u.id WHERE f.fieldkey IN (''k1'', ''k2'', ''k3'') ORDER BY u.id, f.fieldkey

Es esto lo que estás buscando?


SELECT u.username, f.formid, f.userid, f.fieldkey, f.data FROM user AS u LEFT JOIN completed_form_fields AS f ON f.userid = u.id you should look at indexing your userid, index(userid), via phpmyadmin or sql file

mysql-indexes