>

관련 필드가있는 3 개의 테이블이 있습니다

게시물(ID, 제목)
태그(ID, 이름)
tags_map(id, id_post, id_tag)

이렇게 노력하고 있습니다 :

$this->db->select('posts.*,tags.name');
$this->db->from('posts');
$this->db->join('tags_map', 'tags.id_post = posts.id');
$this->db->join('tags', 'tags.id = tags_map.id_tag');
$this->db->group_by('posts.id'); // I can comment this line and same result

이것처럼 보이지만 하나 이상의 tags_map 레코드가 있더라도 하나만 반환합니다.

한 번의 쿼리로 모두 반환하려면 어떻게합니까?

-편집-

어떻게 해결했지만 PHP 처리가 필요합니다

$this->db->select('posts.*,group_concat(tags.name) as thetags');

이것은 필드 thethags = 'tag1, tag2, tag3'을 다시 실행합니다

그러나 tags 테이블에서 다른 파일을 받고 싶습니다 ..

예를 들면 다음과 같습니다.

$this->db->select('posts.*,group_concat(tags.name) as 'thetags',group_concat(tags.relevance) as 'therelevances');

주문을 신뢰할 수 있는지 확실하지 않습니까?


  • 답변 # 1

    당신이 group_concat 에 가지 않으면

    더 좋습니다  솔루션은 문자 길이로 인해 신뢰할 수 없기 때문에 연결하는 데 기본적으로 1024 자로 제한되지만 수동으로 정의 된 증가 할 수는 있지만 정의 된 한계에 완전히 의존 할 수는 없지만 대신 응용 프로그램 계층 (php)에서 처리 할 수 ​​있습니다 데이터를 가져오고 있으며 게시물 및 관련 태그를 표시하려는 곳에서는 게시물별로 순서대로 조인 쿼리를 계속 사용할 수 있습니다. 이제 각 게시물에 둘 이상의 태그가있을 수 있으므로 각 게시물 행으로 인해 결과 세트에 중복 게시물 데이터가 있습니다. 하나의 태그가 있고 동일한 게시물의 다른 행에 두 번째 태그가 있으므로 결과를 반복 할 때 약간의 확인을 추가하여 각 게시물을 한 번만 표시합니다

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

    위의 쿼리에서 t.* 를 추가했습니다.  루프 $currentParent 에서 모든 게시물과 관련 태그를 선택하려면  동일한 게시물이 루프 검사에서 이전 게시물 ID를 가지며 조건이 false를 반환하면 태그를 표시 한 다음 마크 업 (h1)을 사용하여 새 게시물 표시 게시물 제목을 표시합니다. 두 테이블에서 모든 열을 선택했지만 필요한 항목 만 추가해야합니다 태그 테이블의 열 및 게시물 및 태그 테이블의 이름이 같은 열인 경우 쿼리에서 다른 별칭으로 정의 된 열

    $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>'; 
        ...
    }
    
    

    결과 마크 업은 다음과 같습니다

    <h1>Post title 1</h1>
        <p>tag 1</p>
        <p>tag 2</p>
    <h1>Post title 2</h1>
        <p>tag 3</p>...
    
    

    데이터를 표시하지 않고 다른 곳 (웹 서비스)에서 데이터를 사용하는 경우 하나의 조인 된 쿼리를 사용하고 각 게시물에 아래와 같은 관련 태그의 배열이있는 배열/객체를 만들어 데이터를 변환하십시오

    $posts =array();
    foreach ($results as $post) {
     $posts[$post->id]['title'] = $post->title;
     $posts[$post->id]['tags'][] =array('id' => $tag->id ,'name' =>$post->name);
    }
    
    

    다른 방법으로추천하지 않음게시물을 가져오고 루프에서 태그를 가져 와서 쿼리를 실행하여 태그를 가져옵니다.이 솔루션은 작동하지만 원치 않는 쿼리가 포함되어 추가 쿼리가 실행됩니다. 각 게시물.

    이제 group_concat 를 고수하고 싶다면  귀하의 질문에 답변하는 방법 I'm not sure if I can trust the order? 또한 order by 를 추가 할 수있는 방법이 있습니다  와이즈 비즈  결과로 연결된 태그가 주문되도록하고 두 번째 열에는 동일한 주문 기준을 지정할 수 있습니다

    group_concat
    
    

  • 답변 # 2

    이것과 같이 쿼리되어야한다고 생각합니다

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

    결합을 사용할 때 일대 다 관계를 사용해야합니다.이 경우 tags_map 테이블은 게시물 및 태그 테이블과 다 대일 관계를 제공하는 접합 테이블 역할을합니다

  • 답변 # 3

    아래 시도 코드 :

    $this->db->select('posts.*, tags.name');
    $this->db->from('tags_map');
    &this->db->join('posts', 'tags_map.id_post = posts.id');
    $this->db->join('tags', 'tags_map.id_tag = tags.id');
    
    
    $this->db->select('pt.*,group_concat(tg.name order by tg.id) as thetags,group_concat(tg.relevance order by tg.id) as therelevances'); $this->db->from('posts pt'); $this->db->join('tags_map tm', 'tg.id_post = pt.id'); $this->db->join('tags tg','tg.id =tm.id_tag'); $this->db->group_by('pt.id');

  • 이전 c# - WPF ListView 가상화 ListView 가상화를 비활성화하는 방법은 무엇입니까?
  • 다음 hashlib - 파이썬에서 두 파일을 비교하는 가장 좋은 방법은 무엇입니까?