Ile Trouble yapılanma MySQL sorgu tek-çok birden çok tablo üzerinde

0 Cevap php

Kullanıcıların konularda her yazı etiketlemek için izin veren bir blog tarzı uygulaması var. (Gerçek blog gönderileri için) ileti, (çeşitli etiketleri için) konular ve posts_topics (ikisi arasındaki ilişkileri saklayan bir tablo): Ben üç ayrı tablolarda bu verileri tutmak.

Mümkün olduğunca temiz (Ben CodeIgniter kullanıyorum) MVC yapısını korumak amacıyla, tüm post verisi ve ilgili konu verilerini alır ve bir dizi veya nesne döndürür bir MySQL sorgusu çalıştırmak istiyorum. Şimdiye kadar herhangi bir şans sahip değilim.

Tablo yapısı şu şekildedir:

Posts
+--------+---------------+------------+-----------+--------------+---------------+
|post_id | post_user_id  | post_title | post_body | post_created | post_modified |
+--------+---------------+------------+-----------+--------------+---------------+
|     1  |    1          | Post 1     |  Body 1   |  00-00-00    |  00-00-00     |
|     2  |    1          | Post 1     |  Body 1   |  00-00-00    |  00-00-00     |
+--------+---------------+------------+-----------+--------------+---------------+

// this table governs relationships between posts and topics
Posts_topics
+--------------+---------------------+-------------------------+-----------------+
|post_topic_id | post_topic_post_id  | post_topic_topic_id | post_topic_created  | 
+--------------+---------------------+-------------------------+-----------------+
|     1        |    1                | 1                   |         00-00-00    |  
|     2        |    1                | 2                   |         00-00-00    |
|     3        |    2                | 2                   |         00-00-00    |  
|     4        |    2                | 3                   |         00-00-00    |   
+--------------+---------------------+-------------------------+-----------------+

Topics
+---------+-------------+-----------+----------------+
|topic_id | topic_name  | topic_num | topic_modified |
+---------+-------------+-----------+----------------+
|     1   |  Politics   | 1         | 00-00-00       |
|     2   |  Religion   | 2         | 00-00-00       |
|     3   |  Sports     | 1         | 00-00-00       |
+---------+-------------+-----------+----------------+

Ben n başarı ile bu basit sorguyu denedim:

select * from posts as p inner join posts_topics as pt on pt.post_topic_post_id = post_id join topics as t on t.topic_id = pt.post_topic_topic id

Ben de GROUP_CONCAT kullanarak denedim, ama o bana iki sorunları verir: 1) Konu tüm alanları, sadece isimler ihtiyaç, ve 2) ben böylece tüm GROUP_CONCAT verileri (BLOB olarak döndürülür benim MySQL bir aksaklık var bkz here).

Ben de iki sorgular çalıştırmak ve her sonuç için bir dizi dışarı inşa etmeye çalışın herhangi bir öneri işitme açığım; Ben denedim aşağıda kodu ile ancak (bu kod aynı zamanda o tutmak için harika olurdu kullanıcı tablo, birleştirme dahil) başarısız oldu:

    $this->db->select('u.username,u.id,s.*');
    $this->db->from('posts as p');
    $this->db->join('users as u', 'u.id = s.post_user_id');
    $this->db->order_by('post_modified', 'desc');
    $query = $this->db->get();
    if($query->num_rows() > 0)
    {
        $posts = $query->result_array();
        foreach($posts as $p)
        {
            $this->db->from('posts_topics as p');
            $this->db->join('topics as t','t.topic_id = p.post_topic_topic_id');
            $this->db->where('p.post_topic_post_id',$p['post_id']);
            $this->db->order_by('t.topic_name','asc');
            $query = $this->db->get();
            if($query->num_rows() > 0)
            {
                foreach($query->result_array() as $t)
                {
                    $p['topics'][$t['topic_name']] = $t;
                }
            } 
        }
        return $posts;
    }

Herhangi bir yardım büyük takdir.

0 Cevap