我正试图解决这个问题,
我可以轻松地使用循环创建它,从而在第一个内部进行第二次查询,但这似乎并不高效。
目标是获取包含歌曲名称和各种文件类型文件名的行数组。
以下是两个表的简化版本:
歌曲:
song_id*
song_title
Song_files:
file_id
file_song_id*
file_format
file_name
通缉结果:
[
{
"song_id": "1",
"song_title": "Musica Teste 1",
"song_mp3_filename": "song1.mp3",
"song_wav_filename": "song1.wav",
"song_flac_filename": "song1.flac"
},
{
"song_id": "2",
"song_title": "Musica Teste 2",
"song_mp3_filename": "song2.mp3",
"song_wav_filename": "song2.wav",
"song_flac_filename": "song2.flac"
},
{
"song_id": "3",
"song_title": "Musica Teste 3",
"song_mp3_filename": "song3.mp3",
"song_wav_filename": "song3.wav",
"song_flac_filename": "song3.flac"
}
]
如果没有通过php循环,有没有更有效的方法呢?
谢谢!
答案 0 :(得分:1)
你可以在这里阅读有关联接或google的内容:
您可以按照此处所述与查询构建器建立联接:
https://www.codeigniter.com/user_guide/database/query_builder.html
以下是一个例子:
$this->db->from('songs')
->join('song_files', 'songs.song_id = files.file_song_id')
->get()
->result_array();
答案 1 :(得分:0)
select
s.id as song_id,
s.title as song_title,
group_concat(concat_ws(':', f.format, f.name) SEPARATOR ',') as files
from
song s
inner join file f
on s.id = f.song_id
group by s.id;
给出:
+---------+----------------+---------------------------------------------+
| song_id | song_title | files |
+---------+----------------+---------------------------------------------+
| 1 | Musica Teste 1 | mp3:song1.mp3,wav:song1.wav,flac:song1.flac |
| 2 | Musica Teste 2 | wav:song2.wav,flac:song2.flac,mp3:song2.mp3 |
| 3 | Musica Teste 3 | flac:song3.flac,mp3:song3.mp3,wav:song3.wav |
+---------+----------------+---------------------------------------------+
答案 2 :(得分:0)
谢谢ghenghy!根据您的查询,我继续研究并设法破解了一个符合我需求的查询,它可以改进,但它可以完成这项工作:
select
s.song_id as song_id,
s.song_title as song_title,
MAX(IF(f.sfile_filetype = 'sample', f.sfile_file, NULL)) AS sample,
MAX(IF(f.sfile_filetype = 'mp3', f.sfile_file, NULL)) AS mp3,
MAX(IF(f.sfile_filetype = 'wav', f.sfile_file, NULL)) AS wav,
MAX(IF(f.sfile_filetype = 'flac', f.sfile_file, NULL)) AS flac
from
songs s
inner join song_files f
on s.song_id = f.sfile_song_id
group by s.song_id
它在各自的列上提供每个文件名
歌曲:
https://i.stack.imgur.com/Ps1rr.png
song_files:
i.stack.imgur.com/UDUyk.png
结果:
i.stack.imgur.com/ily44.png
- 更新 -
相同但使用codeigniter的查询构建器:
$this->db->select('song_id, song_title, song_extra_title, song_duration');
$this->db->select("MAX(IF(song_files.sfile_filetype = 'sample', song_files.sfile_file, NULL)) AS sample", FALSE);
$this->db->select("MAX(IF(song_files.sfile_filetype = 'mp3', song_files.sfile_file, NULL)) AS mp3", FALSE);
$this->db->select("MAX(IF(song_files.sfile_filetype = 'wav', song_files.sfile_file, NULL)) AS wav", FALSE);
$this->db->select("MAX(IF(song_files.sfile_filetype = 'flac', song_files.sfile_file, NULL)) AS flac", FALSE);
$this->db->join('song_files','song_files.sfile_song_id = songs.song_id');
$this->db->group_by("song_id");
echo json_encode($this->db->get('songs')->result());