如果值存在于多个表中,则从表中获取结果
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 - 如果不在另一个表中,则从一个表中选择,否则从另一个表中选择