【问题标题】:MySQL select all records that match the same others records in another tableMySQL选择与另一个表中相同的其他记录匹配的所有记录
【发布时间】:2018-11-22 08:52:44
【问题描述】:

我有两张桌子: 表 _models 包含字段 namemodel_id 和 表 _tags 包含字段 tag_nametags_idmodel_id

在我的网络应用程序中,我可以通过在表 _tags 中添加记录以及模型的 model_id 相关字段来为模型分配一些标签。

我如何从 _models 表中仅选择在 _tags 表中分配了相同 标签 的模型?

例如,我需要选择同时分配了标签#jacket 和标签#trench 的所有模型

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    对于您的示例,您可以使用 GROUP BY/HAVING 和 COUNT DISTINCT 来查找分配了两个标签的模型。

    SELECT m.model_id, m.name
        FROM models m
            INNER JOIN tags t
                ON m.model_id = t.model_id
        WHERE t.tag_name IN ('#jacket', '#trench')
        GROUP BY m.model_id, m.name
        HAVING COUNT(DISTINCT t.tag_name) = 2;
    

    【讨论】:

    【解决方案2】:

    做同样事情的方式略有不同:

    SELECT
          m.model_id
        , m.name
    FROM
        _models m
    WHERE
        2 = (
            SELECT
                COUNT(*)
            FROM
                _tags t
            WHERE
                    m.model_id = t.model_id
                AND t.tag_name IN ('#jacket', '#trench')
        )
    

    注意 1:您最好将标签名称移动到单独的表格中。所以3个表:models(id,name),tags(id,name),tags2models(tag_id,model_id)

    注意2:不要忘记在表_tags上添加索引(tag_name,model_id)

    【讨论】:

    • 谢谢fifonik!我同意你的看法!在这种情况下,我只写了一个模型和标签表的例子。在项目中,我还有一个单独的标签名称表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多