MySQL查询所有值都满足(减法查询)

时间:2012-01-24 21:04:35

标签: php mysql codeigniter

所以,我有一个活跃的记录查询,我在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');

1 个答案:

答案 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,但很明显,在某一点上,它可能会出现在查询中性能

有关如何使用相同技术的更多示例,请查看以下帖子:

Advanced MySQL Joining. Speeding up query

祝你好运