gpt4 book ai didi

php - 使用内连接并限制数据重复

转载 作者:行者123 更新时间:2023-11-29 20:12:43 25 4
gpt4 key购买 nike

我有这两个表:

enter image description here

enter image description here

第一个是porttag,第二个是portfolio。基本上,porttag 是“投资组合标签”,我在其中关联投资组合项目的标签。

我想从通过 porttag 数据筛选的 portfolio 中获取所有 Portfolio 表。

我已经在使用此查询:

SELECT * FROM portfolio INNER JOIN porttag ON portfolio.id = porttag.port

但是这会返回重复的值,例如:

这会从“可见性”标签返回 1 个项目,从“包装”标签返回 2 个项目。

我不想获得重复的项目。你能帮我吗?

最佳答案

有几种方法可以避免产生重复项。一种是使用返回唯一值的内联 View ,然后加入该 View 。另一种方法是使用EXISTS(相关子查询) 模式。

另一种方法是继续生成重复项,然后使用 GROUP BY 子句折叠它们。 (我不推荐这种方法。我提到它只是因为它是一个选项。)对于现有查询,您可以添加GROUP BY Portfolio.id。但从 porttag 的哪一行填充列是不确定的。 (默认情况下,MySQL 中的非标准扩展将允许查询运行。其他数据库会抛出错误。我们可以让 MySQL 更符合标准,并通过在 sql_mode 中包含 ONLY_FULL_GROUP_BY 来抛出错误。)不推荐这种方法。

内联 View 示例

由于 GROUP BY 子句,内联 View v 返回 port 的唯一值。当有多个标签时,我们使用聚合(在本例中为 MIN())来挑选要返回的标签值。

 SELECT p.*
, v.port
, v.tag
FROM ( SELECT t.port
, MIN(t.tag) AS tag
FROM porttag t
GROUP BY t.port
) v
JOIN portfolio p
ON p.id = v.port

此模式符合有关使用内连接操作的规范。

EXISTS(相关子查询)示例

如果“内部联接”不是必需的,并且如果我们不需要从 porttag 返回任何列,我们可以避免联接操作...

SELECT p.*
FROM portfolio p
WHERE EXISTS ( SELECT 1
FROM porttag t
WHERE t.port = p.id -- related to outer row
)

对于外部查询返回的每一行,都会评估 EXISTS 后面的子查询。如果子查询返回一行或多行,EXISTS 的计算结果为 TRUE,并且返回外部查询中的行。如果子查询不返回任何行,则 EXISTS 的计算结果为 FALSE,在本例中,这意味着外部查询不会返回该行。

关于php - 使用内连接并限制数据重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39981715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com