Consulta a base de datos

edited junio 2011 in SQL y RDBMS
Hola a todos,
tengo un problema con una consulta a una BD en mysql.

Estoy tratando de hacer una consulta que relaciona tres tablas y debo enviar un parámetro para realizar la consulta. El parámetro es un array y pues no me trae la información que necesito.

Dicha consulta la he intentado hacer de dos formas la primerra:

public function getRestauranteOfrece($sqlO){
return $this->find("conditions: $sqlO",
'columns: restaurante.id, nombre, ofrece.tcocina_id',
'join: inner join ofrece on restaurante.id = ofrece.restaurante_id');
}

Leyendo el libro de kumbia, me dice que esta es la forma correcta de hacerlo, bueno en la parte de 'condition' decidí colocar el array, pero no funciona.

La otra fue haciendo la consulta por medio de SQL pero también tengo el problema de array.

public function getRestauranteOfrece($sqlO){
return $this->find_by_sql("select distinct(R.id), nombre
from restaurante R, ofrece O
where R.id = O.restaurante_id
and O.tcocina_id = $sqlO)"
);
}

Quisiera saber si alguien sabe alguna forma de formular esta consulta de manera correcta o si no hay forma de hacerlo así

De antemano gracias por la ayuda

Comentarios

  • edited 12:17
    para ayudarle necesito saber que contiene el array que le esta pasando ($sqlO)
    ¿que resultado obtiene al ejecutar la consulta?¿ algún error?
  • edited junio 2011
    Hola, gracias por contestar tan rapido.

    $sqlO es un array de valores enteros, $sqlO = {1,2,3,4,...}

    y el error que me sale es:

    KumbiaException: Unknown column 'Array' in 'where clause' al ejecutar "SELECT restaurante.id,nombre,ofrece.tcocina_id FROM restaurante inner join ofrece on restaurante.id = ofrece.restaurante_id WHERE Array" (0)

    En el archivo /var/www/gourmet/core/libs/db/adapters/mysql.php en la línea: 158

    Bueno no se si sirva de algo, pero bueno, tengo tres tablas: 'restaurante', 'ofrece', 'presta', la idea de la consulta es sacar los restaurantes que presten todos los servicios presentes en el array, caso idéntico con la tabla ofrece.

    Desde el controlador envío dos array's de la siguiente manera:
    if ($this->has_post('cocinas')) {
    foreach($this->post('cocinas') as $key => $value){
    $sqlO[$i] = $key;
    $i++;
    }
    }
    $i=0;
    if ($this->has_post('servicios')) {
    foreach($this->post('servicios') as $key => $value){
    $sqlP[$i] = $value;
    $i++;
    }
    }
    $restaurante2 = $restaurante2 -> getRestauranteOfrece($sqlO);
    $restaurante3 = $restaurante3 ->getRestaurantePresta($sqlP);

    donde 'cocinas' y 'servicios' son dos array's que llegan desde la vista, los cuales contienen la selección de una serie de checkbox.

    Nuevamente gracias por tu colaboración y pronta respuesta.
  • edited 12:17
    Hola,

    Es posible que lo que retorne una consulta a la BD se guarde en un objeto similar a un dataset sobre el cual hacer otras consultas???
  • edited junio 2011
    que pena la demora en contestar, tuve algunos problemas de conexión

    el error esta en el parámetro que le pasa ya que lo envía directo como array y el sql no queda bien (WHERE Array" (0))

    sobre lo del objeto que se guarde como un dataset, le sera útil ver las asociaciones de los modelos
  • edited 12:17
    Sip me di cuenta del error, asi que decidí concatenar todos los datos que quería dentro del array, y ahora si armar la consulta.

    La consulta final quede así, por si se el ofrece a alguien:
    $sqlP = "(";

    if ($this->has_post('servicios'))
    foreach($this->post('servicios') as $key => $value){
    $sqlP .= $key." , " ;
    }
    $sqlP = substr($sqlP,0,(strlen($sqlP)-3)); // con esta linea almaceno en $sqlP
    $sqlP .= ")"; // todo lo que esta en el array que viene
    // desde la vista
    if ($sqlP == ")" )
    $sqlP = "";

    $sqltotal = "";

    // Finalmente le armo la consulta sql concatenado $sqlP
    $sqltotal = "select distinct(R.id),R.id,R.nombre
    from restaurante R, presta P
    where P.servicio_id in " . $sqlP . " and R.id = P.restaurante_id";
    }

    Se que este tipo de consultas debe evitarse pero no encontré otra forma de hacerlo.

    Muchas gracias por la ayuda.
  • edited 12:17
    Vale
    muchas gracias por compartir la solución a la cual llego
Sign In or Register to comment.