【问题标题】:MySQL query where all values are met (subtractive query)满足所有值的 MySQL 查询(减法查询)
【发布时间】:2012-01-24 21:04:35
【问题描述】:

所以,我有一个活动记录查询,我在 Codeigniter 框架下的 PHP 中执行该查询,我想在其中选择满足连接中某个值的所有条目(下面名为“tracks”)(“tags ' 与轨道相关联 - 每个轨道可以有多个标签绑定到它)。我想知道是否有一种方法可以让查询查找与所有选定标签相关联的曲目。因此,它不是获取所有 links.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');

【问题讨论】:

  • 正在寻找标签表的左外连接?不确定我是否完全理解您向数据库询问的内容。你能澄清一下吗?
  • 对不起,我还在想办法解决它。我有一个“链接”表,其中标签和曲目 ID 链接起来。每个轨道可以有多个链接到它的标签。假设您要抓取与该轨道相关联的标签为 1、2 和 5 的每个轨道(在链接表的单独行中),但不是 1、2 或 5。

标签: php mysql codeigniter


【解决方案1】:

您需要为要查找的每个标签多次加入您的标签表,并在 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');

显然,我不知道你的结构是什么样的,但你是一个聪明的人,一定会明白如何适应你的结构......

它的作用是多次对 LINKED_TAGS 和 TAGS 表进行 INNER JOIN,并强制在特定标签上执行 INNER JOIN。如果无法找到特定对象的标记,则内部连接将失败,因此根本不会返回......您可以添加任意数量的 JOINS,但显然,在某个时刻,它可能会在查询中发生性能。

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

Advanced MySQL Joining. Speeding up query

祝你好运

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2013-08-10
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多