我在数据库中有三个与产品相关的表:
tbl_item -- basic item table
---------
item_id | item_name
tbl_item_term -- descriptive terms
--------------
term_id | term_name
tbl_item_term_map -- assigns terms to items
-----------------
item_id | term_id
感谢an earlier question,我可以通过执行两次查询,按术语选择与特定项目相关的所有项目。
收集项目的条款(在此示例中为item_id 2736):
SELECT
tt.term_id
FROM tbl_item ti
INNER JOIN tbl_item_term_map ttm
on ttm.item_id = ti.item_id
INNER JOIN tbl_item_term tt
on tt.term_id = ttm.term_id
WHERE ti.item_id = 2736
然后我将结果解析成一个数组,所以经过一些PHP代码后,我就离开了:
$array = (1,7,12,20)
然后我把这个数组插入我的网站,如下:
SELECT DISTINCT
item_name
FROM tbl_item ti
INNER JOIN tbl_item_term_map ttm
on ttm.item_id = ti.item_id
INNER JOIN tbl_item_term tt
on tt.term_id = ttm.term_id
WHERE tt.term_id IN($array)
使用1,7,12,20
的条款返回每个相关项目。
我现在想要的是返回具有多个共同术语的项目。例如,
related item1 has terms 1,2,3
related item2 has terms 1,7,9
related item3 has terms 7,8,9
理想情况下,我的新查询只会返回item2,因为它有一个共同的术语1和7。有什么想法吗?
克里斯
修改
换句话说,我有这个问题:
SELECT ti.item_id
FROM tbl_item ti
JOIN tbl_item_term_map ttm on ttm.item_id = ti.item_id
JOIN tbl_item_term tt on tt.term_id = ttm.term_id
WHERE tt.term_id = 1
UNION
SELECT ti.item_id
FROM tbl_item ti
JOIN tbl_item_term_map ttm on ttm.item_id = ti.item_id
JOIN tbl_item_term tt on tt.term_id = ttm.term_id
WHERE tt.term_id = 7
第一个查询本身提供100个结果,第二个查询提供50个结果,当与UNION
结合使用时,总数为120个唯一ID。这是我想要提取的缺少30个重复的ID。如何才能从两个查询中获得重复项?
答案 0 :(得分:0)
为了得到那些超过期限的人,那么对于你的第二个问题可能是这样的: -
SELECT item_name, COUNT(tt.term_id) AS term_id_count, GROUP_CONCAT(tt.term_id)
FROM tbl_item ti
INNER JOIN tbl_item_term_map ttm ON ttm.item_id = ti.item_id
INNER JOIN tbl_item_term tt ON tt.term_id = ttm.term_id
WHERE tt.term_id IN($array)
GROUP BY item_name
HAVING term_id_count >= 2
您可以将这两个查询合并在一起: -
SELECT item_name, COUNT(tt.term_id) AS term_id_count, GROUP_CONCAT(tt.term_id)
FROM tbl_item ti
INNER JOIN tbl_item_term_map ttm ON ttm.item_id = ti.item_id
INNER JOIN tbl_item_term tt ON tt.term_id = ttm.term_id
INNER JOIN
(
SELECT DISTINCT tt.term_id
FROM tbl_item ti
INNER JOIN tbl_item_term_map ttm ON ttm.item_id = ti.item_id
INNER JOIN tbl_item_term tt ON tt.term_id = ttm.term_id
WHERE ti.item_id = 2736
) Sub1
ON tt.term_id = Sub1.term_id
GROUP BY item_name
HAVING term_id_count >= 2
如果您只想要所有子选择中的基本选项,那么: -
SELECT Sub1.item_id
FROM
(
SELECT ti.item_id
FROM tbl_item ti
JOIN tbl_item_term_map ttm on ttm.item_id = ti.item_id
JOIN tbl_item_term tt on tt.term_id = ttm.term_id
WHERE tt.term_id = 1
) Sub1
INNER JOIN
(
SELECT ti.item_id
FROM tbl_item ti
JOIN tbl_item_term_map ttm on ttm.item_id = ti.item_id
JOIN tbl_item_term tt on tt.term_id = ttm.term_id
WHERE tt.term_id = 7
) sub2
ON Sub1.item_id = Sub2.item_id
虽然使用COUNT和HAVING应该更快。