[Codeigniter-users] join時に同一名称のカラムがある場合の処置

Back to archive index

Akihiko Noda noda****@cariy*****
2012年 2月 21日 (火) 18:57:02 JST


Kenjiさん

 Nodaです。返信ありがとうございます。

 なるほど、以下のように明示的に記述すれば、正常に読めました。
 こんな風に書けるのですね〜。

$this->db->select('DEFAULT_KEYWORD_RANK.DEFAULT_KEYWORD_SID,DEFAULT_KEYWORD_RANK.CONTENT_SID,CONTENT.ARTIST,CONTENT.TITLE,DEFAULT_KEYWORD_RANK.RANK');
$this->db->select('CONTENT.RANK as CONTENT_RANK');
$this->db->from('DEFAULT_KEYWORD_RANK');
$this->db->join('CONTENT', 'DEFAULT_KEYWORD_RANK.CONTENT_SID=CONTENT.SID'); $this->db->where('DEFAULT_KEYWORD_RANK.DEFAULT_KEYWORD_SID =', '3303');
$this->db->order_by($sidx, $sord);
$this->db->limit($limit, $start);
$query = $this->db->get();

 ですが実は、CI_Modelを継承した独自クラスを作るために汎用的にしたかったので、selectでは全カラムを読むようにしていました。
 (テーブル名、joinするテーブル名、joinの条件、where句の条件などはパラメータで渡しています)

 ということで、selectするカラム名も明示的にパラメータ渡しにするしかないということなのでしょうね。

 ここはあきらめるしかなさそうです。

 どうもありがとうございました。

 以 上//


(2012/02/21 17:30), Kenji Suzuki wrote:
> Kenji です。
>
>
> On Tue, 21 Feb 2012 17:24:27 +0900
> Akihiko Noda <noda****@cariy*****> wrote:
>
>> 佐々木さん
>>
>>  Nodaです。返信ありがとうございます。
>>
>>  はい、そうですね。現在は、以下のように指定しています。
>> $this->db->select('DEFAULT_KEYWORD_RANK.DEFAULT_KEYWORD_SID,DEFAULT_KEYWORD_RANK.CONTENT_SID,CONTENT.ARTIST,CONTENT.TITLE,DEFAULT_KEYWORD_RANK.RANK');
>>
>>  しかし、以下のように”CONTENT.RANK,DEFAULT_KEYWORD_RANK.RANK”と両方書くと同じエラーになります。
>> $this->db->select('DEFAULT_KEYWORD_RANK.DEFAULT_KEYWORD_SID,DEFAULT_KEYWORD_RANK.CONTENT_SID,CONTENT.ARTIST,CONTENT.TITLE,CONTENT.RANK,DEFAULT_KEYWORD_RANK.RANK');
>>
>>  なので、このテーブル名も含めて別モノと認識してくれれば、問題なくなるのではないかと思った次第です。
> コラム名にエリアス付けたらどうでしょう?
>
> 参考:
> http://chrissilich.com/blog/codeigniter-active-record-aliasing-column-names-to-prevent-overwriting-especially-columns-named-id/
>
>
> // Kenji
>
>  
>>  引き続きよろしくお願いします。
>>
>>  以 上//
>>
>>
>> (2012/02/21 15:58), クロスキューブ佐々木 wrote:
>>> $this->db->select("DEFAULT_KEYWORD_RANK.RANK");
>>> の様にselectで明示的にカラムを指定したらどうでしょうか?
>>>
>>> --
>>>
>>>
>>>
>>> 2012年2月21日12:59 Akihiko Noda <noda****@cariy*****>:
>>>> Nodaと申します。
>>>> お世話になっております。
>>>>
>>>> 現在、CodeIgniterを使って、システム専用のCMSを制作しています。
>>>>
>>>> 今、CONTENTテーブルとDEFAULT_KEYWORD_RANKテーブルの2つのテーブルがあります。
>>>>
>>>> DEFAULT_KEYWORD_RANKテーブルには、たとえば”hot”というキーワードに関するランキングを設定できるようにしています。
>>>> CONTENTテーブルはベースとなるテーブルで、コンテンツのTITLE、ARTIST、TYPEなどのデータが設定してあります。
>>>> 両テーブルは、CID(コンテンツID)というシステム一意の番号で結び付けています。
>>>>
>>>> なので、DEFAULT_KEYWORD_RANKテーブルを引くときに、CONTENTテーブルをjoinして、TITLE、ARTISTなど を合わせて読むようにします。
>>>>
>>>> この時、両テーブルの全カラムのデータを読もうと思ったのですが、うまく行きませんでした。(Internal Server Error)
>>>> 原因は、両テーブルに同一名称のカラム(RANK)があるからでした。
>>>>
>>>> $this->db->from('DEFAULT_KEYWORD_RANK');
>>>> $this->db->join('CONTENT', 'DEFAULT_KEYWORD_RANK.CONTENT_SID=CONTENT.SID');
>>>> $this->db->where('DEFAULT_KEYWORD_RANK.DEFAULT_KEYWORD_SID =', '3303');
>>>> $this->db->order_by($sidx, $sord);
>>>> $this->db->limit($limit, $start);
>>>> $query = $this->db->get();
>>>>
>>>> エラーメッセージは以下です。
>>>>
>>>> DEBUG - 2012-02-21 10:52:41 --> DB Transaction Failure
>>>> ERROR - 2012-02-21 10:52:41 --> Query error: Column 'RANK' in order clause is ambiguous
>>>>
>>>> 実際にやりたいことは以下のコマンドのようなことで、これは成功します。
>>>>
>>>> select * from DEFAULT_KEYWORD_RANK join CONTENT on DEFAULT_KEYWORD_RANK.CONTENT_SID=CONTENT.SID where DEFAULT_KEYWORD_RANK.DEFAULT_KEYWORD_SID=3303;
>>>>
>>>> resultに同じ名前のフィールドを作ろうとしてしまうからでしょうか?
>>>>
>>>> 今のところ、必要なカラムの名前を重ならないように指定して読むようにしています。
>>>> ですが、実際には、resultにテーブル名のprefixをつけるなどして識別できなければならないように思います。
>>>> そうする方法は現時点でありますでしょうか?
>>>> もしあれば教えていただきたく思います。
>>>>
>>>> 以上、よろしくお願いいたします。
>>>>
>>>> 以 上//
>>>>
>>>>
>>




Codeigniter-users メーリングリストの案内
Back to archive index