2012-01-24 4 views
0

그래서 PHP에서 Codeigniter 프레임 워크 아래에서 (내가 '트랙'이라는 이름의) 모든 항목을 선택하려고하는 활성 레코드 쿼리가 있습니다. 조인의 특정 값 (트랙과 연관된 '태그'- 각 트랙에는 여러 개의 태그가 묶여있을 수 있음)이 충족됩니다. 내가 궁금해하는 점은 선택한 모든 태그가 연결된 트랙을 쿼리에서 찾을 수있는 방법이 있는지 여부입니다. 따라서 links.tag_id가 1 인 모든 트랙을 가져 오지 않고 links.tag_id가 2 인 모든 트랙을 가져 오는 대신 links.tag_id가 1뿐 아니라 2 인 모든 트랙을 반환합니다. 기본적으로 당신이 추가하는 더 많은 태그들로 선택된 결과들을 좁혀주는 감산 적 쿼리. 여기에 내가 지금까지 진행 한 작업은 다음과 같습니다 당신이 필요로하는 것은 당신이 찾아 귀하의 where 절에 각 태그 별칭을 사용하려는 각 태그에 대한 태그 테이블에 여러 번 참여하는 것입니다모든 값을 만족시키는 MySQL 쿼리 (감산 쿼리)

$this->db->select('tracks.id, 
         tracks.name AS name, 
         tracks.filename, 
         tracks.url_name, 
         tracks.file_path_high, 
         tracks.filesize, 
         tracks.categories, 
         tracks.duration, 
         tracks.folder, 
         links.tag_id, 
         SUM(links.weight) AS total_weight, 
         tag_data.tag_name'); 

$this->db->distinct(); 
$this->db->from('music AS tracks'); 
$this->db->where_in('links.tag_id', array('1', '2'); 
$this->db->join('linked_tags AS links', 'links.track_id = tracks.id', 'inner'); 
$this->db->join('tags AS tag_data', 'tag_data.id = links.tag_id', 'inner'); 
+0

는 왼쪽 외부 찾고 계십니까 조인이 같은 기술을 사용하는 방법에 대한 자세한 예를 들어

, 후속 게시물을 볼 수? 내가 당신이 데이터베이스에 대해 무엇을 요구하고 있는지 완전히 이해하고 있는지 확신 할 수 없습니다. 당신은 명확히 할 수 있습니까? – Kevin

+0

죄송합니다. 여전히 내 머리를 감싸려고합니다. 나는 태그와 트랙 ID의 링크가있는 '링크'테이블을 가지고있다. 각 트랙에는 여러 개의 태그가 링크되어 있습니다. 1, 2 및 5가 아닌 해당 트랙과 연결된 태그 (링크 테이블의 별도 행)를 가진 모든 트랙을 가져 오려고한다고 가정 해 봅시다. – jpea

답변

0

. 예를 들어 내가이 작업을 수행 할 것 :

$this->db->select('...'); 
$this->db->distinct(); 
$this->db->from('music AS tracks'); 
//Tag 1 
$this->db->join('linked_tags AS links1', 'links1.track_id = tracks.id', 'inner'); 
$this->db->join('tags AS tag_data1', 'tag_data1.id = links1.tag_id AND tag_data1.tag = "tag1"', 'inner'); 
//Tag 2 
$this->db->join('linked_tags AS links2', 'links2.track_id = tracks.id', 'inner'); 
$this->db->join('tags AS tag_data2', 'tag_data2.id = links2.tag_id AND tag_data2.tag = "tag2"', 'inner'); 
//Tag 3 
$this->db->join('linked_tags AS links3', 'links3.track_id = tracks.id', 'inner'); 
$this->db->join('tags AS tag_data3', 'tag_data3.id = links3.tag_id AND tag_data3.tag = "tag3"', 'inner'); 

을 분명히 ...

난 당신 구조가 어떻게 생겼는지 모르겠지만, 당신은 훌륭한 동료이고 확실하게 당신의 구조에 적응하는 방법을 이해합니다

INNER가하는 일은 LINKED_TAGS 및 TAGS 테이블을 여러 번 조인하고 INNER JOIN이 특정 태그에서 강제로 수행되도록합니다. 특정 객체에 대해 태그를 찾을 수 없으면 내부 조인이 실패하고 따라서 반환되지 않습니다 ... 원하는만큼 많은 JOINS를 추가 할 수 있지만 분명히 특정 시점에 쿼리를 수행 할 수 있습니다 공연. 태그 테이블에

Advanced MySQL Joining. Speeding up query

행운