MySQL INNER JOIN 结果每列有 2 个

标签 mysql tags inner-join

我有一个关系数据库 (innoDB),它是一个具有不同“标签类型”的标签系统。我需要从多个列中检索包含 ALL 标签的记录,但我在获取想要的结果时遇到了一些问题。

有一个主要的“目标”表和 2 个“标签”表。每个“标签”表代表不同的“标签类型”。

                     my_targets
=====================================================
id     name     url      tagtype1_id    tagtype2_id
-----------------------------------------------------
1     file1     url1          1              5
2     file2     url2          4              5
3     file2     url2          2              5
4     file2     url2          2              2
5     file3     url3          4              3


    my_tagtype1            my_tagtype2
=================     ================
id      title           id     title
-----------------     ----------------
1       sdrty            1     sdfg
2       fssdf            2     wpoie
3       qweok            3     q;jej
4       awerk            4     slth
5       w;eir            5     aw;eoi

查询:

SELECT * FROM
    (SELECT t.target_name, t.target_url
    FROM my_targets t
    INNER JOIN my_tagtype1 ON t.tagtype1_id = my_tagtype1.tagtype1_id
    WHERE my_tagtype1.tagtype1_id IN (2,4)
    GROUP BY target_name
    HAVING COUNT(distinct my_tagtype1.tagtype1_id) = 2) AS t1
INNER JOIN
    (SELECT t.target_name, t.target_url
    FROM my_targets t
    INNER JOIN my_tagtype2 ON t.tagtype2_id = my_tagtype2.tagtype2_id
    WHERE my_tagtype2.tagtype2_id IN (5)
    GROUP BY target_name) AS t2

问题

如果用户选择以下标签:

     tagtype1       tagtype2
    ==========     ==========
        id             id 
    ----------     ----------
         2              5
         4    

..结果是:

  target_name    target_url     target_name    target_url
=============================================================
    file2           url2           file2           url2
    file2           url2           file1           url1

这是应该的:

  target_name    target_url
===============================
    file2           url2

非常感谢任何建议。谢谢

最佳答案

我现在已经设法解决了这个问题并解决了我遇到的问题。我会尽力提供对所需内容的理解。

我首先注意到的是,我需要将行 ON t1.target_name = t2.target_name 添加到查询的末尾。当然,查询需要基于“JOIN”的标准。

OP 中示例搜索的结果是:

 target_name     target_url     target_name     target_url
=============================================================
   file2            url2          file2           url2

所以我得到了我想要的结果,但仍然加倍了列。

当我尝试将 GROUP BY 添加到查询末尾时,我收到一条错误消息,指出要分组的列名称不明确。我在这里找到了解释: http://www.mysqltutorial.org/mysql-inner-join.aspx

我没有选择所有列/结果 (*),而是输入了我想要的特定列名称。

工作查询是:

SELECT t1.target_name, t1.target_url FROM
    (SELECT t.target_name, t.target_url
        FROM my_targets t
        INNER JOIN my_tagtype1 ON t.tagtype1_id = my_tagtype1.tagtype1_id
        WHERE my_tagtype1.tagtype1_id IN (2,4)
        GROUP BY target_name
        HAVING COUNT(distinct my_tagtype1.tagtype1_id) = 2) AS t1
INNER JOIN
    (SELECT t.target_name, t.target_url
        FROM my_targets t
        INNER JOIN my_tagtype2 ON t.tagtype2_id = my_tagtype2.tagtype2_id
        WHERE my_tagtype2.tagtype2_id IN (5)
        GROUP BY target_name) AS t2
        ON t1.target_name = t2.target_name

...现在最终结果是这样的:

 target_name     target_url
=============================
   file2           url2

关于MySQL INNER JOIN 结果每列有 2 个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53173212/

相关文章:

sql - 给定这 3 个表生成标签云计数

sql - 删除所有找不到 JOIN 的行?

MYSQL - 计数回合

mysql 连接表而不显示重复数据

php - Laravel:根据每个项目的半径选择选择一定距离内的模型

php - 导出 CSV 中的选定行并导入回同一 CSV 文件以更新 PHP/MySQL 中的选定行

android - enableReaderMode 和 enableForegroundDispatch 有什么区别?

PHP, MySQL select, order by field and group it

javascript - 如何在悬停时将类添加到不同的元素?

mysql - 同一张表内两次内连接