mysql内部连接结果每列有2个

soat7uwm  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(350)

我有一个关系数据库(innodb),它是一个具有不同“标记类型”的标记系统。我需要从多个列中检索包含所有标记的记录,但我在获取所需结果时遇到了一些问题。
有一个主“targets”表和两个“tags”表。每个“tags”表表示不同的“tagtypes”。

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

如有任何建议,我们将不胜感激。谢谢

b1uwtaje

b1uwtaje1#

我现在已经设法解决了这个问题,解决了我遇到的问题。我会尽我最大的努力让大家了解需要什么。
我首先注意到我需要那条线 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

相关问题