我有一个关系数据库(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
如有任何建议,我们将不胜感激。谢谢
1条答案
按热度按时间b1uwtaje1#
我现在已经设法解决了这个问题,解决了我遇到的问题。我会尽我最大的努力让大家了解需要什么。
我首先注意到我需要那条线
ON t1.target_name = t2.target_name
添加到查询的末尾。当然,查询需要“join”所基于的条件。op中的示例搜索结果是:
所以我得到了我想要的结果,但仍然是双倍的列。
当我尝试添加
GROUP BY
在查询结束时,我发现一个错误,指出要分组的列名不明确。我在这里找到了解释:http://www.mysqltutorial.org/mysql-inner-join.aspx我没有选择所有列/结果(*),而是输入了我要查找的特定列名。
工作查询是:
…最终结果是: