【问题标题】:JOIN two tables that share a common grandparent, but not parent加入两个共享共同祖父母但不是父母的表
【发布时间】:2019-09-28 05:53:38
【问题描述】:

我正在尝试解压缩一个像这样组织图像和文本的布局系统:

挑战在于我需要(以某种方式)将每个text.content 与其条目以及跟随它的第一个images.filename 相关联。基本上介绍了第二代堂兄弟。

理想情况下,我会得到类似的东西:

| entry.id  | images.filename  | texts.content
|-----------|------------------|--------------
| 0         | img.jpg          | lorem  

我之前成功地使用一系列LEFT JOINs 将图像与其条目相关联,如下所示:

SELECT entries.id, images.filename 
FROM images 
LEFT JOIN containers 
    ON images.container_id = containers.id 
LEFT JOIN layers 
    ON containers.layer_id = layers.id 
LEFT JOIN entries 
    ON layers.entry_id = entries.id

但这在尝试将文本连接到图像时不起作用,因为它们没有直接关联。您必须达到入门级别才能确定关联,但是您如何跟踪最接近图像的最佳候选?

 

目前

我觉得我正在接近至少将图像和文本与同一条目相关联的东西:

SELECT entries.id, images.filename, texts.content
FROM entries, images, texts
LEFT JOIN containers a 
    ON texts.container_id = a.id 
LEFT JOIN containers b
    ON images.container_id = b.id 
LEFT JOIN layers 
    ON containers.layer_id = layers.id 
LEFT JOIN entries 
    ON layers.entry_id = entries.id

尽管出于某种原因,这仍然是Not unique table/alias: 'entries'

到目前为止,我已经尝试了建议的别名内容 here(这似乎并不适用)并开始在 questions dealing with subqueries 进行黑客攻击,但是......我已经用完了搜索词。

 

这可能吗?

需要明确的是,我不是在这里寻找完整的答案,只是关于如何使用 JOIN 执行以下操作的一些提示:

A) 显示文本和图像及其条目关联(我想我已经接近了。)

B) 将一个文本条目与其后面的任何图像条目的数据相关联。。现在这感觉像是不可能的,但我想这就是为什么我要问比我了解更多的人。

编辑:请注意,可以有多个图层包含图像或文本,我需要从每个条目返回 所有 文本。

【问题讨论】:

  • 你如何确定一个特定的容器包含图像或文本?这些表中的一个 id(s) 是否具有图像或文本的固定值?
  • Madhur Bhaiya : 容器不知道它们包含什么——它们的 id 只是被它们的孩子(图像或文本)引用。
  • 那么,您是否确保图像和文本表中不会出现相同的id 值?

标签: mysql join left-join inner-join


【解决方案1】:

看着你的架构,你似乎可以尝试使用基于联合的虚假聚合函数来选择文件名和文本

SELECT id, max(filename) filename, max(content) content 
FROM (
    SELECT entries.id, images.filename, NULL content
    FROM entries
        INNER JOIN layers 
            ON entries.id  = layers.entry_id
        INNER JOIN containers 
            ON containers.layer_id = layers.id
        INNER JOIN images 
            ON images.container_id = containers.id
    UNION ALL 
    SELECT entries.id, NULL, texts.content
    FROM entries
        INNER JOIN layers 
            on entries.id  = layers.entry_id
        INNER JOIN containers 
            on containers.layer_id = layers.id
        INNER JOIN texts 
        ON texts.container_id = containers.id ) t
GROUP BY id 

【讨论】:

  • 这看起来像它最初的工作,但它只从每个条目返回一个文本。留下赞成票,因为它肯定比我更接近。
  • 如果您需要多个条目,则不能使用单个 sql 查询 .. 您必须使用程序语言并使用两个不同的 sql 查询进行搜索 .. 一个用于文件名,一个用于文本内容。 . 并合并结果 al 表示级别 ..
猜你喜欢
  • 1970-01-01
  • 2012-09-16
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 2021-03-25
相关资源
最近更新 更多