Lebih baik jika Anda tidak menggunakan group_concat
solusi karena tidak dapat diandalkan karena panjang karakternya memiliki batas default 1024 karakter untuk digabungkan tetapi dapat ditingkatkan yang didefinisikan dalam manual
tetapi Anda tidak dapat sepenuhnya bergantung pada batas yang ditentukan sebagai gantinya Anda dapat menanganinya di lapisan aplikasi Anda (php) seperti Anda mengambil data dan di suatu tempat Anda ingin menampilkan posting dan tag terkaitnya, Anda masih dapat menggunakan kueri bergabung dengan memesan berdasarkan posting sekarang setiap posting dapat memiliki lebih dari satu tag sehingga kumpulan hasil akan memiliki data posting duplikat karena setiap baris posting akan memiliki satu tag dan baris lain dengan posting yang sama akan memiliki tag kedua dan seterusnya sekarang ketika Anda mengulang hasil Anda, tampilkan setiap posting hanya sekali oleh menambahkan beberapa cek
$this->db->select('p.*,t.*');
$this->db->from('posts p');
$this->db->join('tags_map tm', 't.id_post = p.id');
$this->db->join('tags t', 't.id = tm.id_tag');
$this->db->order_by('p.id asc,t.id asc');
$results = $this->db->get();
Dalam kueri di atas saya telah menambahkan t.*
untuk memilih semua postingan dan tag terkaitnya sekarang dalam loop $currentParent
akan memiliki id posting sebelumnya di loop periksa apakah itu posting yang sama kemudian tampilkan tag-nya jika kondisinya salah maka posting baru menampilkan judul posting menggunakan markup (h1), saya telah memilih semua kolom dari kedua tabel tetapi Anda harus menambahkan hanya yang diperlukan kolom dari tabel tag dan jika tabel posting dan tag memiliki kolom dengan nama yang sama maka dalam kueri mendefinisikannya dengan alias berbeda
$currentParent = false;
foreach ($results as $post) {
if ($currentParent != $post->id) {
echo '<h1>' . $post->title . '</h1>';
$currentParent = $post->id;
}
echo '<p>' . $post->name . '</p>'; /** here list tags info*/
echo '<p>' . $post->tag_other_details . '</p>';
...
}
Markup yang dihasilkan akan seperti
<h1>Post title 1</h1>
<p>tag 1</p>
<p>tag 2</p>
<h1>Post title 2</h1>
<p>tag 3</p>...
Jika Anda tidak menampilkan data dan Anda menggunakannya di tempat lain (layanan web), maka tetap gunakan satu kueri gabungan dan ubah data Anda dengan membuat larik/objek, setiap pos memiliki larik tag terkait seperti di bawah ini
$posts =array();
foreach ($results as $post) {
$posts[$post->id]['title'] = $post->title;
$posts[$post->id]['tags'][] =array('id' => $tag->id ,'name' =>$post->name);
}
ada cara lain yang sangat tidak disarankan dapatkan kiriman dan dalam lingkaran dapatkan tag dengan menjalankan kueri sekarang solusi ini akan berhasil tetapi akan melibatkan kueri yang tidak diinginkan sehingga akan ada kueri tambahan yang dieksekusi untuk setiap kiriman.
Sekarang jika Anda benar-benar ingin tetap menggunakan group_concat
pendekatan untuk menjawab pertanyaan Anda I'm not sure if I can trust the order?
ada juga cara Anda dapat menambahkan order by
di group_concat
sehingga tag gabungan yang dihasilkan akan dipesan dan untuk kolom kedua Anda dapat menempatkan kriteria pemesanan yang sama
$this->db->select('p.*,group_concat(t.name order by t.id) as thetags,
group_concat(t.relevance order by t.id) as therelevances');
$this->db->from('posts p');
$this->db->join('tags_map tm', 't.id_post = p.id');
$this->db->join('tags t', 't.id = tm.id_tag');
$this->db->group_by('p.id');