2017-05-25 5 views
0

ich einige Probleme mit versuchen, dies herauszufinden,MySQL Join verschiedene Reihen in verschiedene Spalten

ich leicht mit einer Schleife machen kann somit eine zweite Abfrage innerhalb des ersten zu machen, aber das macht scheint nicht zu effizient sein.

Ziel ist es, ein Array von Zeilen zu erhalten, die den Songnamen und die verschiedenen Dateitypen Dateinamen enthalten.

Hier vereinfacht Versionen der beiden Tabellen:

Songs:

song_id* 
song_title 

Song_files:

file_id 
file_song_id* 
file_format 
file_name 

Gewünschtes Ergebnis:

[ 
    { 
     "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" 
    } 
] 

Gibt es eine effizientere Möglichkeit, dies ohne Schleife über PHP zu tun?

Danke!

+0

Was ist Ihr aktuelles Abfrage?SELECT song_id, song_title, song_extra_title, song_duration, song_mp3_filename, song_wav_filename, song_flac_filename FROM songs s JOIN song_files f ON s.song_id = f.file_song_id; 'verbindet die beiden Tabellen und gibt diese zurück. – WOUNDEDStevenJones

+0

Die Spalten _song_extra_title, song_duration, song_mp3_filename_ existieren nicht, der von Ihnen vorgeschlagene Join gibt mir 1 Songtitel pro Dateityp, was ich suche ist eine Zeile pro Song, und auf dieser Zeile haben die diferente Dateinamen – Impossivel

+0

I Finde die gesuchten Dateien mit den verschiedenen Dateinamen ('WHERE datei_format = 'mp3'' usw., nehme ich an), aber woher kommen' song_extra_title' und 'song_duration'? – WOUNDEDStevenJones

Antwort

0

Dank ghenghy! Basierend o Abfrage, weiterhin i Forschung und verwalten eine Abfrage hacken, die meine Bedürfnisse entsprechen, kann sie verbessert werden, aber es macht den Job:

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 

Es gibt jeden Dateinamen auf ihrer jeweiligen Spalte

Lieder :

https://i.stack.imgur.com/Ps1rr.png

song_files:

i.stack.imgur.com/UDUyk.png

Ergebnis:

i.stack.imgur.com/ily44.png

- update -

die gleichen, aber Query Builder ist mit 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()); 
1

können Sie hier lesen über beitritt oder Google für sie:

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

Sie mit dem Query Builder eine Join tun können, wie hier beschrieben:

https://www.codeigniter.com/user_guide/database/query_builder.html

Hier ist ein Beispiel :

$this->db->from('songs') 
    ->join('song_files', 'songs.song_id = files.file_song_id') 
    ->get() 
    ->result_array(); 
+0

Die vorgeschlagene Antwort verbindet beide Tabellen und gibt mir mehrmals den gleichen Song, jede Zeile mit einem anderen Format Dateiname, was ich suche ist nur eine Zeile pro Song, die Zeile mit den verfügbaren Formaten – Impossivel

+0

abhängig von Wie viele Daten tatsächlich zurückgegeben werden, es ist definitiv eine Option, den Join zu machen und dann die Daten einmal zu durchlaufen, um genau zu formatieren, wie Sie wollen – WOUNDEDStevenJones

+0

Diese Option ist auf dem Tisch, nur wenn ich es implementiert habe, dachte ich "es muss ein besser sein Weg ": P Wenn ich einen anderen Weg bekomme, werde ich es mit Schleifen – Impossivel

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; 

Gibt:

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

Danke machen! Das löst den größten Teil des Problems, aber das Ideal wäre, wenn jeder Dateiformatdateiname in der Zeile enthalten wäre. – Impossivel

Verwandte Themen