MySQL将不同的行连接到不同的列

时间:2017-05-25 21:55:10

标签: php mysql codeigniter

我正试图解决这个问题,

我可以轻松地使用循环创建它,从而在第一个内部进行第二次查询,但这似乎并不高效。

目标是获取包含歌曲名称和各种文件类型文件名的行数组。

以下是两个表的简化版本:

歌曲:

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循环,有没有更有效的方法呢?

谢谢!

3 个答案:

答案 0 :(得分:1)

你可以在这里阅读有关联接或google的内容:

http://www.sql-join.com/

您可以按照此处所述与查询构建器建立联接:

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