【问题标题】:Select a column with only one mapping in a Many-to-many table在多对多表中选择只有一个映射的列
【发布时间】:2015-01-11 17:37:48
【问题描述】:

我有一个包含产品和标签列的多对多表。如何查询“给我在其映射中只有这些标签之一的产品列表。

输入:'3'(这对应于映射表中的 tagid 列) 预期输出:4(这对应于映射的最后一行中的 productid 列值。请注意 productid 1 未返回,因为 1 具有与之关联的其他映射(标签 1 和标签 2))。

-- Table: Product
+---------+-----------+
| productid | name      |
+---------+-----------+
|       1 | HTC       |
|       2 | Nokia     |
|       3 | Samsung   |
|       4 | Motorolla |
+---------+-----------+

-- Table: Mappings
+------+-----------+
| tagid| productid |
+------+-----------+
|    1 |       1   |
|    1 |       2   |
|    2 |       1   |
|    2 |       3   |
|    3 |       1   |
|    3 |       4   |
+------+-----------+

-- Table: Tags
+------+-------+
| tagid  | name  |
+------+-------+
|    1 | blue   |
|    2 | black  |
|    3 | pink   |
+------+-------+

【问题讨论】:

  • 编辑您的查询并显示您想要的结果。

标签: mysql sql


【解决方案1】:

您在寻找having 子句吗?

select producctid
from mappings m
group by productid
having count(*) = 1;

如果您还想要标签 id,您可以轻松获得:

select producctid, max(tagid) as tagid
from mappings m
group by productid
having count(*) = 1;

因为mapping 中只有一个标签,所以max() 将返回该标签。

编辑:

如果要指定单个映射,则可以使用:

select producctid, max(tagid) as tagid
from mappings m
group by productid
having count(*) = 1 and max(tagid) = 3;

【讨论】:

  • 如果产品的tagid小于3怎么办。查询是否有效? max 只给出最大值。不是吗?
  • @yagnasri 。 . .要求是只有一个标签。因此,一行的max() 是该行的值。
猜你喜欢
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多