2016-12-22 28 views
2

別のクエリが機能しないため、をMYSQLクエリの1つに使用できないという問題に直面しています。私が理解できないのは、両方のクエリが無関係であり、最初のクエリを変更しても2番目のクエリに影響しないことです。 order_bylist_all_resortsに影響を与えている理由がわかりますか?クエリのorder_byが無関係のクエリを失敗させます

私はintesresting部分にいくつかのコメント(//)を追加しました。

$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(); 
} 

私が手にエラーがある:game_resortsをSELECT 'ORDER句' で1054不明な列 'のシーズン

データベースエラーはエラー番号を発生しました。 id_resortseason DESCのLIMIT BY ORDER 1

更新game_resorts

FROM:

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 
+0

エラーメッセージから、MySQLは列のシーズンがgame_resortsテーブルに存在しないと考えます。列のシーズンがgame_resortsテーブルに存在していますか?両方のスペルをダブルチェックしましたか? – dpp

+0

'describe game_resorts;'の出力を提供できますか? – oschlueter

+0

しかし、 'list_all_resorts'は' game_resort _ '。$ type'テーブルを扱っていません。これは '' game_resort_cash''のようなものです。 '' game_resort_cash''には '' season'だけが含まれています。 'game_resorts'は' season'を含んでおらず、そのテーブルから 'season'を要求しません。または私ですか? – remyremy

答えて

3

$this->dbは、両方の関数呼び出しでは同じオブジェクトであることを覚えておいてください、それでは、それが受信呼び出しのシーケンスを見てみましょう:

//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(); 

すぐ隣ためdbのオブジェクトを設定する方法があります。クエリが実行されるメソッド、およびクエリを実行してオブジェクトをリセットするメソッドが含まれます。 updateおよびgetは第2のグループであり、set,where,order_by,limit,selectおよびfromが第1のグループである。 trans_startおよびtrans_completeは、それらとは独立して動作します。

order_bylimitの呼び出しは、updateの呼び出しの後にあるため、次の文、つまりgetに影響します。エラーメッセージには、ORDER BY season DESCだけでなく、生成されたステートメントにLIMIT 1も表示されています。この問題を解決するには

、あなたはupdateorder_bylimitを置く必要があります。

$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(); 
+0

素晴らしい、それは働いた!私はそれのようなものを疑ったが、私は 'trans_complete'が全てをリセットすると思った – remyremy

0

は、今あなたがgame_resortsテーブルからid_resortのCOLだろうSELECT game_resorts.id_resortを言っています。あなたは、すべてのコラムだけでなく特定のコラムを探すように言っているわけではありません。すべてを選択したくない場合はSELECT game_resorts.id_resort, game_resorts.season ... $this->db->select('id_resort');シーズンの列も呼び出す必要があります。その男を更新してください。

+0

'season'は' game_resorts'にありません。このクエリでは選択しません。少なくとも私はそうは思わない... ...? – remyremy

0

あなたのクエリ:このクエリで

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

MySQLがgame_resortsテーブルにシーズン列が見つかりません。したがって、シーズンを使用してソートを行いたい場合は、両方のテーブルを結合する必要があります。シーズンの列がgame_resort_cashテーブルに見つかりました。私はそれはあなたのために働くことを願っていますMySQLのdatabseに

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 

を実行し、このクエリ:ここ

は左がクエリに参加しています。おかげさまで