我有一个关系数据库 (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/