2017-11-15 17 views
2

こんにちは皆私はこの結果を与えるcodeigniterモデルでクエリを作成するのに苦労しています。これまで私はデータベース上にこれらのテーブルを持っています。私は参加を試みているし、それは私のために働いていない。重複した曲や異なる出版社/ライターを表示するだけです。私のモデルからの私の現在の質問があります。Codeigniter select join重複結果を与える

public function get_songs_in_playlist($playlist_id) 
{ 
    $this->db->select(
     "si.song_info_file_name, 
     si.song_info_revised_file_name, 
     a.artist_name, 
     si.song_info_id as songinfoid, 
     array_to_string(array_agg(c.composer_name),'/'), 
     array_to_string(array_agg(p.publisher_name),'/'), 
     array_to_string(array_agg(st.tag_name),',')" 
    ); 
    $this->db->from('songs_in_playlist sp'); 
    $this->db->join('song_info si', 'sp.song_info_id = si.song_info_id', 'left'); 
    $this->db->join('original_artist a', 'si.artist_id = a.artist_id', 'left'); 
    $this->db->join('composer c', 'si.composer_id = c.composer_id', 'left'); 
    $this->db->join('publisher p', 'si.publisher_id = p.publisher_id', 'left'); 
    $this->db->join('song_info_tags sit', 'si.song_info_id = sit.song_info_id', 'left'); 
    $this->db->join('song_tags st', 'st.tag_id = sit.tag_id', 'left'); 
    $this->db->where('sp.playlist_id', $playlist_id); 
    $this->db->group_by(array("si.song_info_id", "a.artist_name", "c.composer_name" , "p.publisher_name")); 

    $query = $this->db->get(); 


    return $query->result_array(); 

} 

ソング表

song_info_id song_name 
1    songA 

出版社の表

publisher_id publisher_name 
1    publisherA 
2    publisherB 

ライター表

writer_id  writer_name  song_info_id publisher_id 
1    writerA   1    1 
2    writerB   1    2 

結果は次のようになります。

参加から
Song Name  Writers    Publishers 
SongA   writerA, writerB  publisherA, publisherB 

現在の結果:配列の

Song Name  Writers    Publishers 
SongA   writerA    publisherA 
SongA   writerB    publisherB 

結果ブレインストーミングの数分後によく

Array ( 
    [0] => Array ( 
     [song_info_file_name] => Cartoon_-_On_On_(ft__Daniel_Levi).mp3 
     [song_info_revised_file_name] => 1510657326_Cartoon_-_On_On_(ft__Daniel_Levi).mp3 
     [status_artist_name] => Cartoon (feat. Daniel Levi) 
     [songinfoid] => 133 [title] => On & On (feat. Daniel Levi) 
     [array_to_string] => 
    ) 
    [1] => Array ( 
     [song_info_file_name] => Cartoon_-_On_On_(ft__Daniel_Levi).mp3 
     [song_info_revised_file_name] => 1510657326_Cartoon_-_On_On_(ft__Daniel_Levi).mp3 
     [status_artist_name] => American Authors 
     [songinfoid] => 133 
     [title] => On & On (feat. Daniel Levi) 
     [array_to_string] => 
    ) 
    [2] => Array ( 
     [song_info_file_name] => 01-Reverie_(feat__King_Deco).mp3 
     [song_info_revised_file_name] => 1510728747_01-Reverie_(feat__King_Deco).mp3 
     [status_artist_name] => Illenium 
     [songinfoid] => 136 
     [title] => Reverie (feat. King Deco) [array_to_string] => 
     ) 
    [3] => Array ( 
     [song_info_file_name] => 01-Reverie_(feat__King_Deco).mp3 
     [song_info_revised_file_name] => 1510728747_01-Reverie_(feat__King_Deco).mp3 
     [status_artist_name] => Cartoon (feat. Daniel Levi) 
     [songinfoid] => 136 
     [title] => Reverie (feat. King Deco) 
     [array_to_string] => 
    ) 
    [4] => Array ( 
     [song_info_file_name] => 01-Reverie_(feat__King_Deco).mp3 
     [song_info_revised_file_name] => 1510728747_01-Reverie_(feat__King_Deco).mp3 
     [status_artist_name] => American Authors 
     [songinfoid] => 136 
     [title] => Reverie (feat. King Deco) 
     [array_to_string] => 
    ) 
    [5] => Array ( 
     [song_info_file_name] => Cartoon_-_On_On_(ft__Daniel_Levi).mp3 
     [song_info_revised_file_name] => 1510657326_Cartoon_-_On_On_(ft__Daniel_Levi).mp3 
     [status_artist_name] => Illenium 
     [songinfoid] => 133 
     [title] => On & On (feat. Daniel Levi) 
     [array_to_string] => 
    ) 
    [6] => Array ( 
     [song_info_file_name] => American_Authors_-_Best_Day_Of_My_Life.mp3 
     [song_info_revised_file_name] => 1510540526_American_Authors_-_Best_Day_Of_My_Life.mp3 
     [status_artist_name] => Cartoon (feat. Daniel Levi) 
     [songinfoid] => 134 
     [title] => Best Day of My Life 
     [array_to_string] => Mix, Half, Alternative, Mid 
    ) 
    [7] => Array ( 
     [song_info_file_name] => American_Authors_-_Best_Day_Of_My_Life.mp3 
     [song_info_revised_file_name] => 1510540526_American_Authors_-_Best_Day_Of_My_Life.mp3 
     [status_artist_name] => American Authors 
     [songinfoid] => 134 
     [title] => Best Day of My Life [array_to_string] => Mix, Half, Alternative, Mid 
    ) 
    [8] => Array ( 
     [song_info_file_name] => American_Authors_-_Best_Day_Of_My_Life.mp3 
     [song_info_revised_file_name] => 1510540526_American_Authors_-_Best_Day_Of_My_Life.mp3 
     [status_artist_name] => Illenium 
     [songinfoid] => 134 
     [title] => Best Day of My Life 
     [array_to_string] => Mix, Mix, Half, Half, Alternative, Alternative, Mid, Mid 
    ) 
) 
+0

結果配列をprint_r()に渡します。 –

+0

質問を結果に更新しました。何が起こったのかは、内部のすべてが複製されていることです。 – RealRich

+0

これはポストグレですね。 – sintakonte

答えて

0

私はこの1つを解決することができるようにする方法を見つけました。コメントした人に感謝します。 btw mysqlにタグ付けして申し訳ありませんが、私はpostgresqlを使用していました。将来のために私のソリューションです。

public function get_shareable_songs_playlist($playlist_id) 
{ 
    $this->db->select("si.songinfoid, 
    si.filename, 
    si.revised_filename, 
    si.title, 

    array_to_string(
     ARRAY(
      select status_artist_name from status s where s.song_info_id = si.songinfoid 
     ), 

    '/' 
    ) AS artist, 

    array_to_string(
     ARRAY(
      select c.composer_name from composer c, song_composer sc where c.composer_id = sc.composer_id AND sc.song_info_id = si.songinfoid 
     ), 

    '/' 
    ) AS composer, 

    array_to_string(
     ARRAY(
      select p.publisher_name from publisher p, composer c, song_composer sc where p.publisher_id = c.publisher_id AND c.composer_id = sc.composer_id AND sc.song_info_id = si.songinfoid 
     ), 

    '/' 
    ) AS publisher, 

    array_to_string(
     ARRAY(
      select s.tag_name from song_tags s, song_info_tags sit where s.tag_id = sit.tag_id AND sit.song_info_id = si.songinfoid AND sit.info_tag_delete_flag = 0 
     ), 

    '/' 
    ) AS tags, 
    sp.playlist_id"); 
    $this->db->from("(SELECT song_info_id AS songinfoid, song_info_file_name AS filename, song_info_revised_file_name AS revised_filename, song_info_original_title AS title FROM song_info si GROUP BY song_info_id)si"); 
    $this->db->join('songs_in_playlist sp', 'sp.song_info_id = si.songinfoid'); 
    $this->db->join('playlist play', 'sp.playlist_id = play.playlist_id'); 
$this->db->where('sp.playlist_id', $playlist_id); 
$this->db->where('play.playlist_share', 1); 
$query = $this->db->get(); 

return $query->result_array(); 
} 
関連する問題