Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Kueri untuk pos dan tag dalam kueri yang sama

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ganti nama baris duplikat di MySQL

  2. SQL / PHP:dapatkan semua hasil dalam waktu X hingga Y, dan deteksi jika ada waktu yang tersedia di antaranya

  3. SqlBulkCopy setara di MySql?

  4. Doktrin 2 - 2 tempat desimal di atas pelampung?

  5. Menggunakan hubungan polimorfik Eloquent untuk mengkategorikan data di Laravel