所以,我有一个活跃的记录查询,我在Codeigniter框架下用PHP做,我想选择所有条目(下面命名为'tracks'),其中满足连接中的某个值('tags '与轨道相关联 - 每个轨道可以有多个标签绑定它。我想知道的是,是否有办法让查询查找包含所有选定标签的轨道。因此,不是让它获得link.tag_id为1的所有曲目,而是使用links.tag_id为2的所有曲目,它将返回所有具有links.tag_id为1以及2的曲目。基本上,它是减法查询,它将所选结果缩小到您添加的更多标记。以下是我到目前为止所做的事情:
$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 :(得分: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多次加入LINKED_TAGS和TAGS表并强制INNER JOIN在特定标签上完成。如果找不到特定对象的标记,则内部联接将失败,因此将不会返回...您可以添加所需数量的JOINS,但很明显,在某一点上,它可能会出现在查询中性能
有关如何使用相同技术的更多示例,请查看以下帖子:
祝你好运