Foros del Web » Programando para Internet » PHP »

Consulta sql con muchos and

Estas en el tema de Consulta sql con muchos and en el foro de PHP en Foros del Web. Por culpa de mas o menos un mal planteamiento de tablas y una fecha de entrega que ya empieza a caer cerca he terminado con ...
  #1 (permalink)  
Antiguo 06/11/2012, 17:29
Avatar de juanito1712  
Fecha de Ingreso: mayo-2010
Ubicación: Valencia
Mensajes: 1.124
Antigüedad: 13 años, 11 meses
Puntos: 66
Consulta sql con muchos and

Por culpa de mas o menos un mal planteamiento de tablas y una fecha de entrega que ya empieza a caer cerca he terminado con una tabla que tiene un campo con estos datos y no me da tiempo a cambiar el planteamiento por ahora

asi que, en una variable tengo este string por ejemplo
|14|16|21|15|17|19

luego tengo una tabla de usuarios y necesito seleccionar los usuarios de esa tabla con las ids indicadas arriba
¿hay alguna chapuza para salir del paso hasta que implemente una tabla de relaciones como dios manda?
  #2 (permalink)  
Antiguo 06/11/2012, 17:47
 
Fecha de Ingreso: abril-2009
Ubicación: en un lugar de la mancha
Mensajes: 236
Antigüedad: 15 años
Puntos: 38
Respuesta: Consulta sql con muchos and

Aki esta lo tuyo

Código PHP:
<?php 

$string 
'14|16|21|15|17|19';

$string explode('|'$string);

$users = array();

foreach(
$string as $s)
{
    
$query mysql_query("SELECT usuarios FROM usuarios WHERE id = '$s'");
    
$row mysql_fetch_assoc($query);
    
    
$user[] = $row['usuarios'];
}

echo 
'<pre>';
print_r($user);
echo 
'</pre>';

?>
  #3 (permalink)  
Antiguo 06/11/2012, 18:31
Avatar de juanito1712  
Fecha de Ingreso: mayo-2010
Ubicación: Valencia
Mensajes: 1.124
Antigüedad: 13 años, 11 meses
Puntos: 66
Respuesta: Consulta sql con muchos and

deseaba no caer en ese bucle pero mas o menos me acabas de confirmar que por ahora no hay mas remedio que saturar un poco el servidor a base de consultas independientes...

gracias ;)
  #4 (permalink)  
Antiguo 06/11/2012, 18:47
 
Fecha de Ingreso: abril-2009
Ubicación: en un lugar de la mancha
Mensajes: 236
Antigüedad: 15 años
Puntos: 38
Respuesta: Consulta sql con muchos and

Pues por ahora no se me ocurre otra cosa.... alo mejor alguien por el foro tiene otra idea de como hacerlo

buena suerte
  #5 (permalink)  
Antiguo 06/11/2012, 19:01
Avatar de skiper0125  
Fecha de Ingreso: octubre-2010
Ubicación: $this->Mexico('Toluca');
Mensajes: 1.127
Antigüedad: 13 años, 6 meses
Puntos: 511
Respuesta: Consulta sql con muchos and

Cita:
Iniciado por rolygc Ver Mensaje
Pues por ahora no se me ocurre otra cosa.... alo mejor alguien por el foro tiene otra idea de como hacerlo

buena suerte
Hola que tal.

Si no deseas pasar por el foreach se me ocurre lo siguiente

Código PHP:
$string '14|16|21|15|17|19';
$string str_replace("|""' or id='" $string);
$query mysql_query("SELECT usuarios FROM usuarios WHERE id = '$string'");

// y el resultado del query seria 
// SELECT usuarios FROM usuarios WHERE id = '14' or id='16' or id='21' or id='15' or id='17' or id='19' 
No es lo mejor pero te puede ayudar

Saludos
__________________
Recuerda que estamos aquí para orientarte, y no para hacer tu trabajo.
Si mi aporte fue de ayuda, recuerda que agradecer no cuesta nada +1

Skiper0125
  #6 (permalink)  
Antiguo 06/11/2012, 20:25
Avatar de juanito1712  
Fecha de Ingreso: mayo-2010
Ubicación: Valencia
Mensajes: 1.124
Antigüedad: 13 años, 11 meses
Puntos: 66
Respuesta: Consulta sql con muchos and

@skiper0125 esa era la primera opción que tenia en mente pero realmente del funcionamiento interno de mysql no se mucho y no se que resultará menos estresante para el servidor, si realizar 50 consultas consecutivas a una tabla de unos 300 registros o realizar una unica consulta con 50 ors
  #7 (permalink)  
Antiguo 06/11/2012, 22:15
 
Fecha de Ingreso: abril-2009
Ubicación: en un lugar de la mancha
Mensajes: 236
Antigüedad: 15 años
Puntos: 38
Respuesta: Consulta sql con muchos and

A nivel de optimizacion ya depende de ti y el disenno y el patron ke estes siguiendo.

Logico mientras menos consultas y menos registros tengas mucho mas optimo.

tu tambien puedes ayudar a esa optimizacion con un mejor disenno de BD y estrucutras de los datos.

1- Como tienes la base de datos disennada ??
2- Tienes tipo MySAM o InnoDB
3- Usaras mas SELECT ke INSERT o UPDATE en esta tabla
3- Tienes primary key a valores unicos
4- Tienes index creados para las columnas ke mas vas a realizar la buskeda
5- Accederas local o a traves de la red

Tu mismo contestate estas preguntas y vas haciendo lo ke le llaman el tunning la sintonizacion para un mejor funcionamiento a tu proyecto.

Por supuesto ke mientras menos coneccion y menos consultas realices mas eficiente trabajaras depende por supuesto ke todo lo ke te dije anterior cantidad de registro a buscar con index es mas eficiente ke sin index

Prueba usar la clausara IN y no evaluar tanto OR

Código PHP:
$string '14|16|21|15|17|19';
$string str_replace("|"","$string);
$query mysql_query("SELECT usuarios FROM usuarios WHERE id IN ('$string')"); 
Y prueba todas las posibilidades ke se te ocurran a ver cual es la mas eficiente y ya sabras cual usar.

en tu mysql server escribe

EXPLAIN SELECT usuarion FROM usuarios WHERE id IN ('14,16,21,15,17,19');

EXPLAIN SELECT usuarios FROM usuarios WHERE id = '14' OR id='16' OR id='21' OR id='15' OR id='17' OR id='19'

y si no tienes index creados en el id columna crealo y veras ke es ams eifciente

espero te ayude, buena suerte

Última edición por rolygc; 07/11/2012 a las 08:17
  #8 (permalink)  
Antiguo 07/11/2012, 11:26
Avatar de juanito1712  
Fecha de Ingreso: mayo-2010
Ubicación: Valencia
Mensajes: 1.124
Antigüedad: 13 años, 11 meses
Puntos: 66
Respuesta: Consulta sql con muchos and

es myisam con un indice en id y otro en nombre ya que desde dentro de la aplicación trabajo con ids pero desde los formularios de busquedas para los usuarios por nombres

pero por lo que has dicho, ¿utilizar in de ese modo es como si utilizase un or pero que resultaría menos estresante?
  #9 (permalink)  
Antiguo 07/11/2012, 11:32
 
Fecha de Ingreso: enero-2011
Ubicación: DF
Mensajes: 898
Antigüedad: 13 años, 2 meses
Puntos: 155
Respuesta: Consulta sql con muchos and

Cita:
Iniciado por juanito1712 Ver Mensaje
es myisam con un indice en id y otro en nombre ya que desde dentro de la aplicación trabajo con ids pero desde los formularios de busquedas para los usuarios por nombres

pero por lo que has dicho, ¿utilizar in de ese modo es como si utilizase un or pero que resultaría menos estresante?
seria cuestión de que lo probaras pero a mi parecer in sera mejor ya que es una función optimizada
__________________
No me interesan ni las gracias ni los karmas , pero si que se genere conocimiento, si se dio con la respuesta por favor confirmalo
  #10 (permalink)  
Antiguo 07/11/2012, 11:35
 
Fecha de Ingreso: abril-2009
Ubicación: en un lugar de la mancha
Mensajes: 236
Antigüedad: 15 años
Puntos: 38
Respuesta: Consulta sql con muchos and

Cita:
Iniciado por juanito1712 Ver Mensaje
es myisam con un indice en id y otro en nombre ya que desde dentro de la aplicación trabajo con ids pero desde los formularios de busquedas para los usuarios por nombres

pero por lo que has dicho, ¿utilizar in de ese modo es como si utilizase un or pero que resultaría menos estresante?
Para eso te deje esto

EXPLAIN SELECT usuarios FROM usuarios WHERE id IN ('14,16,21,15,17,19');

EXPLAIN SELECT usuarios FROM usuarios WHERE id = '14' OR id='16' OR id='21' OR id='15' OR id='17' OR id='19'

para ke tu mismo veas cual es mas optima para ti.

de todas formas IN es ams optimo ke varios OR
  #11 (permalink)  
Antiguo 07/11/2012, 12:00
Avatar de juanito1712  
Fecha de Ingreso: mayo-2010
Ubicación: Valencia
Mensajes: 1.124
Antigüedad: 13 años, 11 meses
Puntos: 66
Respuesta: Consulta sql con muchos and

pues ya lo probaré cuando las tablas estén pobladas a ver que respuesta tiene cada consulta ;)
gracias a todos

Etiquetas: muchos, sql, tabla, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:56.