我有一个关系数据库(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
任何建议都将不胜感激。谢谢
答案 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