MySQL INNER JOIN结果每列有2个

时间:2018-11-06 13:46:31

标签: mysql tags inner-join

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

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

                     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

任何建议都将不胜感激。谢谢

1 个答案:

答案 0 :(得分:0)

我现在设法解决了这个问题并解决了我遇到的问题。我会尽力提供所需的知识。

我首先注意到的是,我需要在查询末尾添加行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