【问题标题】:how do i join third table values into main join?如何将第三个表值连接到主连接中?
【发布时间】:2023-01-29 20:28:09
【问题描述】:

在这里查询我有https://www.db-fiddle.com/f/32Kc3QisUEwmSM8EmULpgd/1

SELECT p.prank, d.dare 
FROM dares d
INNER JOIN pranks p ON p.id = d.prank_id
WHERE d.condo_id = 1;

我有一个 ID 为 1 的 condo,它与 dares 有唯一联系,与恶作剧有联系,与 condos_pranks 有唯一联系

我想从两个表中获取所有独特的恶作剧,我使用上面的查询来获取关系

dares to pranks,预期结果是L,M,N - Yes,No,Maybe,这是正确的,但我也想把那些放在condos_pranks中,ID是1,4,5,6 = L,O,P,Q

所以我尝试用左连接加入表,因为它可能没有condos_pranks

SELECT p.prank, d.dare 
FROM dares d
INNER JOIN pranks p ON p.id = d.prank_id
LEFT JOIN condos_pranks pd ON pd.condo_id = d.condo_id AND pd.prank_id = p.id
WHERE d.condo_id = 1;

但结果与第一个相同,我想要的是

prank dare
L Yes
M No
N Maybe
O No
P No
Q No

如果 condos_pranks 的 prank_id 不在 dares 中,则默认为 No = 2

如何连接它?

【问题讨论】:

  • 这是给你的表结构吗?还是您正在创建的?似乎这里进行了一些循环连接,为简单起见可以将其删除。

标签: mysql sql


【解决方案1】:

这似乎是一种识别无关信息的练习。您无法将某些内容连接到没有键的表中,但是如果您知道默认值,那么您可以使用类似 coalesce 的方法来识别没有数据连接的记录 NULL 并将它们替换为您的默认值。

我在上面的评论中提到这个表模式毫无意义。你到处都有钥匙,确实有各种各样的循环引用。如果这是您的派生模式,请考虑在此处停止并重新访问关系。如果不是,并且它是一种教育,我怀疑它是,请忽略并认识到您正在从事的工作中的逻辑缺陷。也许考虑获取提供的数据并创建一个更加规范化的新表模式,并使用其他表来处理多对多和一对多的关系。

dbfiddle

SELECT 
   pranks.prank,
   COALESCE(dares.dare, 'No')
FROM pranks LEFT OUTER JOIN 
    dares ON pranks.id = dares.prank_id
ORDER BY pranks.prank ASC;

【讨论】:

    【解决方案2】:

    clearlyclueless给出了正确的解释 要获得结果,还可以使用以下 SELECT:

    SELECT 
        pranks.prank,
        case 
        when dare is null then 'No'
        else dare
        end
    FROM pranks LEFT  OUTER JOIN 
        dares ON pranks.id = dares.prank_id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 2019-08-09
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多