如果值存在于多个表中,则从表中获取结果

Posted

技术标签:

【中文标题】如果值存在于多个表中,则从表中获取结果【英文标题】:Get Results from table if value are present in multiple 【发布时间】:2021-03-14 19:01:31 【问题描述】:

我有这张桌子:

affiliate_id parent_affiliate_id
4 5
3 4
2 3
1 2
6 5
8 7
10 9
12 11

我需要做一个查询,显示会员的所有父母。

预期结果:

affiliate_id all_parent_id
1 2, 3, 4, 5
2 3, 4, 5
3 4, 5
... ...
10 9
12 11

我正在尝试使用此查询但没有成功:

$aff = 1;
foreach( $wpdb->get_results("
SELECT A.*
 FROM $wpdb->prefixtable A
 JOIN 
  ( SELECT affiliate_id
       , parent_affiliate_id
       FROM $wpdb->prefixtable
       WHERE $aff IN(affiliate_id, parent_affiliate_id) 
        ) B
 ON A.affiliate_id = B.affiliate_id 
 AND A.parent_affiliate_id = B.parent_affiliate_id
 " ) as $key => $row) 
$subaff1 =  $row->parent_affiliate_id;
 echo 'Affiliate Id: '. $aff; echo ' - Parent: '. $subaff1; echo     '<br/>';

我做错了什么?

提前致谢。

已编辑

也许我部分解决了 使用此代码

SELECT affiliate_id, (SELECT GROUP_CONCAT( parent_affiliate_id) from affiliates B where B.affiliate_id BETWEEN A.affiliate_id AND B.parent_affiliate_id) AS all_parent_id FROM affiliates A

显示每个会员 ID 的所有父母 但我也需要出示附属公司的父母 只有一个父母

你可以在这里测试 https://www.db-fiddle.com/f/dKBfxUpb8fBXLTQqRKbN2B/1

【问题讨论】:

感谢@brombeer 添加标签。你不能帮我吗? 您可以通过以表格方式显示查询的预期结果来使其更清楚 嗨@LuisVenezian,我需要的查询结果是。在我的情况下,会员 ID 为 1。我需要显示所有与 id 为 1 的会员连接的父级:1 -> 2 -> 3 -> 4 -> 5 如您所见,1 是会员 ID,2 是父 ID,但 2 相同会员 id 并且有 3 个类似的父级和 3 个有 4 个类似的父级和 4 个有 5 个类似的父级,所以所有的都是连接的。 你的 SQL 查询在这个小提琴 db-fiddle.com/f/5WRvcMBwbwCJhTtpX9rt4v/0 上工作,你是否启用了 WP DEBUG LOG 来检查是否有任何东西被抛出? 嗨@Phil,我的查询工作错误只给了我一个结果。我需要列出所有 id 为 1 的附属公司的父母。所以我需要一个类似的结果:2,3,4,5 但我的结果只有 2。 【参考方案1】:

您可以使用GROUP_CONCAT 和如下子查询:

SELECT affiliate_id, 
(SELECT GROUP_CONCAT(affiliate_id) from affiliates B where B.parent_affiliate_id = A.affiliate_id) AS all_parent_id 
FROM affiliates A

你可以在这里测试https://www.db-fiddle.com/f/5WRvcMBwbwCJhTtpX9rt4v/2

Here you can find more information. 保持简单。

【讨论】:

对不起@Lvcios,但你的代码不是我想要的。读好我的帖子,我需要显示来自附属 1 的连接 附属 1 有父 2 和 2 有父 3 和 3 有父 4 和 4 有父 5。所以附属 1 连接到所有这些。如果我要求会员 1,我需要这种输出。【参考方案2】:

如果可用(mysql 8.0,MariaDB 从 10.2.2 开始),可以通过递归通用表表达式来解决,如下所示:

WITH RECURSIVE affiliate_relation (affiliate_id, all_parent_ids) AS (
  SELECT
    DISTINCT(a_p.parent_affiliate_id),
    CAST('' AS CHAR(20))
  FROM
    affiliate AS a_p
    LEFT JOIN affiliate AS a_c
      ON a_p.parent_affiliate_id = a_c.affiliate_id
  WHERE
    a_c.affiliate_id IS NULL
  UNION
  SELECT
    a.affiliate_id,
    IF (
      a_r.all_parent_ids = '',
      a.parent_affiliate_id,
      CONCAT(a.parent_affiliate_id, ',', a_r.all_parent_ids)
    )
  FROM
    affiliate AS a
    JOIN affiliate_relation AS a_r
      ON a.parent_affiliate_id = a_r.affiliate_id
)
SELECT
  affiliate_id,
  all_parent_ids
FROM
  affiliate_relation
WHERE
  all_parent_ids != ''
ORDER BY
  affiliate_id

可以在这里测试https://www.db-fiddle.com/f/h18jBgh2322J6fj5XRofKu/1

【讨论】:

以上是关于如果值存在于多个表中,则从表中获取结果的主要内容,如果未能解决你的问题,请参考以下文章

如果 Redshift 中存在表,则从表中删除行,否则忽略删除

Redshift:如果值存在,则从表 1 中获取值,否则从表 2 中提取

如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回

mysql - 如果不在另一个表中,则从一个表中选择,否则从另一个表中选择

如果产品表中存在品牌 ID,则从品牌表中获取品牌 ID 名称

SQL 语法从表中选择某些内容,如果结果不存在,则将结果插入新表中