2012-01-24 31 views
0

因此,我有一个活动记录查询,我在Codeigniter框架下使用PHP进行操作,我想选择所有条目(在下面命名为'tracks')一个连接中的某个值被满足(与轨道相关的'标签' - 每个轨道可以有多个标签绑定在它上面)。我想知道的是,如果有一种方法可以让查询查找具有与其关联的所有选定标签的曲目。因此,不是让所有曲目的links.tag_id为1,而是使用links.tag_id为2的所有曲目,它会返回所有曲目的links.tag_id为1以及2.本质上,它是一个减法查询,它将您选择的结果缩小到您添加的更多标记。这是我迄今打算: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的轨道(在链接表的单独行中),但不是1,2或5。 – jpea

回答

0

你需要的是加入你的标签表多次为你想找到和你的where子句中使用的每个标签别名每个标签。例如,我可以这样做:

$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 JOIN LINKED_TAGS和TAGS表多次,并强制INNER JOIN在特定标签上完成。如果找不到特定对象的标签,则内部连接将失败,因此将不会被返回...您可以添加尽可能多的JOINS,就像您想要的那样,但显然,在某个点上,它可能会增加查询性能。

有关如何使用相同技术的更多例子,请查看追踪后:

Advanced MySQL Joining. Speeding up query

好运