mysql - 从三个表中的数组中查找唯一值

标签 mysql

我在数据库中有三个与产品相关的表:

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。我怎样才能只从两个查询中获取重复项?

最佳答案

为了让那些有超过学期的人,那么对于你的第二个查询可能是这样的:-

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

您可以像这样将您的 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 应该更快。

关于mysql - 从三个表中的数组中查找唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19355304/

相关文章:

php/mysql - 向 MySQL 发送多个数据

mysql - 在 MySQL 中选择自定义列

php - 无法获取更新的文本区域值

mysql - RoR : if a company exists, 将company_id分配给用户,否则创建公司

php - 为什么 Magento 在生成 ID 后无法保存客户?

php - 在 Laravel 中构建以下数据库查询的最佳方法是什么

mysql - MDB2 准备好的语句并插入 NOW()

mysql - 如何选择重复项以获得正确的结果?

mysql - 从 WordPress 内部恢复 .sql 导出到 WordPress 数据库?

php - 如果事务发生错误,对表的id索引有影响吗?