【问题标题】:mySQL: Selecting data from multiple tablesmySQL:从多个表中选择数据
【发布时间】:2011-07-19 09:54:27
【问题描述】:

我需要帮助构建一个 mysql 查询以从多个表中进行选择。 我有三个与图像相关的数据库表:imagestagstag_asc。我想通过提供image_id 来获取图像数据及其标签名称。

例如,以下是我的表格结构:

图片:

image_id    image_name     path       date   
1            test.jpg      dir       1311054433

标签:

tag_id      image_id
1             1
2             1

tag_asc:

tag_id      tag_name
1            "first"
2            "second"
3            "third"

我想从 images 表中获取带有 image_id = 1 的图像的数据,并从 tag_asc 表中获取与 image_id=1 关联的所有标签名称。

我正在使用 CodeIgniter Active 记录,但我只需要加入表格的想法。

感谢您的帮助。

【问题讨论】:

    标签: mysql codeigniter activerecord


    【解决方案1】:
    select *
    from images i
    left join tags t on t.image_id = i.image_id
    left join tag_asc ta on ta.tag_id = t.tag_id
    where i.image_id = 1;
    

    使用LEFT JOIN 意味着即使其他表中没有连接行也会返回行(但您将在缺少行的列中获得null 值),这通常是可取的。

    如果您想要一行(未在问题中说明,但在 cmets 中),请使用:

    select i.image_id, group_concat(tag_name) as tag_names
    from images i
    left join tags t on t.image_id = i.image_id
    left join tag_asc ta on ta.tag_id = t.tag_id
    where i.image_id = 1
    group by 1;
    

    【讨论】:

    • 谢谢,但正如我所说,一张图片可以在表格标签中有多行标签(请参阅我的示例数据)。此查询仅返回标签表中的一行。例如看到 image_id 1 有两个标签,但它只返回 1。你能告诉我如何修复它吗?谢谢。
    • @Bohemian,感谢您的回复。实际上,您的第一个解决方案正是我正在寻找的,但是在 while 循环中获取结果存在一些问题。对此非常抱歉。
    • @ypercube “按 1 分组”有什么问题?该语法可以追溯到 SQL92 标准。
    • @Bohemian:没什么问题。我期待GROUP BY image_id。我没有注意到 where 仅限于一张图片。
    • @Bohemian:是的,我知道,我只是不使用此功能,所以当我看到它时有时会感到困惑(通常按 ORDER BY 排列)。
    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2013-09-04
    相关资源
    最近更新 更多