Estoy enfrentando un problema en el que no puedo usar order_by en una de mis consultas MYSQL ya que hace que otra no funcione. Lo que no entiendo es que ambas consultas no están relacionadas y cambiar la primera no debería afectar a la segunda . ¿Puedes ver por qué order_by está afectando a list_all_resorts?

He agregado algunos comentarios (//) a las partes interesantes.

$shift_level = $this->shift_previous_day($list_all_resorts, 'level');

protected function shift_previous_day($list_all_resorts, $type) {
    foreach ($list_all_resorts->result() as $list_all_resorts_Array){
        $shift_DB = $this->shift_previous_day_DB($list_all_resorts_Array->id_resort, $type);
    }
    echo $shift_previous_day_DB;
} 

protected function shift_previous_day_DB($id_resort, $type){
    $this->db->trans_start();
    $this->db->set($type.'_d134', $type.'_d133', FALSE);
    $this->db->set($type.'_d1', $type.'_d0', FALSE);
    $this->db->set($type.'_d0', '0', FALSE);
    $this->db->where('id_resort', $id_resort);
    $this->db->update('game_resort_'.$type); 
    $this->db->order_by('season', 'DESC');  // If I remove this line there is no error thrown
    $this->db->limit('1'); 
    $this->db->trans_complete();
    if ($this->db->trans_status() === FALSE){
        return log_message();
    }
    else {
        $result = 'all OK';
        return $result;
    }  
}

$add_cash_to_history = $this->add_todays_stat_to_history('cash'); 

//This is where list_all_resorts will fail. Before that it works fine
protected function add_todays_stat_to_history($data_type) {
    $info_message = '';
    $list_all_resorts = $this->list_all_resorts();  // The is where list_all_resorts is called
    foreach ($list_all_resorts->result() as $row_list_all_resorts){
        //do some stuff
    }
    return $info_message;
}

protected function list_all_resorts(){  
    $this->db->select('id_resort'); // This is where the error points to
    $this->db->from('game_resorts');
    return $this->db->get();
}

El error que recibo es:

Se produjo un error en la base de datos Número de error: 1054 Columna desconocida 'temporada'

en 'cláusula de orden' SELECCIONE game_resorts. id_resort DESDE

game_resorts ORDENAR POR season LÍMITE DESC 1

Actualizar:

describe game_resorts:
id_resort   int(11) NO  PRI     auto_increment  
resort_name varchar(45) NO              
resort_country  varchar(45) YES             
resort_description  varchar(256)    YES             
id_player   int(11) YES MUL 

describe `game_resort_cash`:
id  int(11) NO  PRI         
id_resort   int(11) NO  MUL         
season  int(3)  NO      1       
cash_d0 int(11) YES             
cash_d1 int(11) YES                         
cash_d134   int(11) YES 
2
remyremy 22 dic. 2016 a las 23:08

3 respuestas

La mejor respuesta

Tenga en cuenta que $this->db es el mismo objeto en ambas llamadas a funciones, así que veamos la secuencia de llamadas que recibe:

//From shift_previous_day_DB
$this->db->trans_start();
$this->db->set($type.'_d134', $type.'_d133', FALSE);
$this->db->set($type.'_d1', $type.'_d0', FALSE);
$this->db->set($type.'_d0', '0', FALSE);
$this->db->where('id_resort', $id_resort);
$this->db->update('game_resort_'.$type); 
$this->db->order_by('season', 'DESC');
$this->db->limit('1'); 
$this->db->trans_complete();
//From list_all_resorts
$this->db->select('id_resort');
$this->db->from('game_resorts');
$this->db->get();

Hay métodos que simplemente configuran el objeto db para cuando se ejecuta la siguiente consulta, y métodos que ejecutan la consulta y restablecen el objeto. update y get son de segundo grupo, mientras que set, where, order_by, limit, select y from son del primero. trans_start y trans_complete funcionan independientemente de ellos.

Como las llamadas a order_by y limit son posteriores a la llamada a update, afectan la siguiente declaración, es decir, el get. Puede ver eso en el mensaje de error: no solo hay un ORDER BY season DESC, sino también un LIMIT 1 en la declaración generada.

Para solucionar esto, debe poner order_by y limit antes de update:

$this->db->trans_start();
$this->db->set($type.'_d134', $type.'_d133', FALSE);
$this->db->set($type.'_d1', $type.'_d0', FALSE);
$this->db->set($type.'_d0', '0', FALSE);
$this->db->where('id_resort', $id_resort);
$this->db->order_by('season', 'DESC');
$this->db->limit('1'); 
$this->db->update('game_resort_'.$type); 
$this->db->trans_complete();
3
rsanchez 26 dic. 2016 a las 21:18

Su consulta:

SELECT game_resorts.id_resort FROM game_resorts ORDER BY season DESC LIMIT 1

En esta consulta, Mysql no encontró la columna de la temporada en la tabla game_resorts. Por lo tanto, si desea ordenar usando la temporada, debe unirse a ambas tablas. Porque la columna de la temporada se encuentra en la tabla game_resort_cash.

Aquí está la consulta de combinación izquierda:

select t1.*,t2.* from game_resorts t1
left join game_resort_cash t2
on(t1.id_resort=t2.id_resort) order by t2.season desc limit 1

Ejecute esta consulta en su base de datos Mysql. Espero que funcione para usted. Gracias.

0
sumanta.k 26 dic. 2016 a las 19:01

En este momento estás diciendo SELECT game_resorts.id_resort, que sería el id_resort col de la tabla game_resorts. No le está diciendo que busque todos los cols sino los específicos. Si no desea un select all do SELECT game_resorts.id_resort, game_resorts.season ... en otras palabras: $this->db->select('id_resort'); también debe llamar a la columna de la temporada. Actualiza a ese tipo.

0
Adrianopolis 22 dic. 2016 a las 22:16