如何在三重内连接表中显示适当的数据?

Posted

技术标签:

【中文标题】如何在三重内连接表中显示适当的数据?【英文标题】:How can I display the appropriate data in a triple inner-join table? 【发布时间】:2019-09-16 19:01:43 【问题描述】:

我是 SQL 查询的新手,我正在尝试正确编写一个查询,以显示事件、它的信息以及它所属的类别。

我想要一个如下所示的结果:

标题:乐队对战!

时间:晚上 7:00

地点:帕克兰学校

类别:音乐、学校、公共

在我的示例中,我有一个包含三个类别的事件,但无法正确显示它。我可以让它显示包括一个类别在内的所有信息,或者重复三次显示每个重复列表的一个类别。我还注意到,如果我在两个表中有相同的行,它只会显示它最后加载的那个。有没有办法告诉它要加载哪个行单元格?

过去,我通过多个 SQL 查询成功地做到了这一点,但我知道这是不正确的。我有一个显示所有项目的查询,每次显示时,都会发出另一个查询并获取相关数据,然后再针对该数据进行另一个查询,等等。我会在每次页面加载时运行数百个查询!

我确信这不是最好的方法,所以我正在尝试编写一个查询来处理所有事情。我认为 JOINS 是要走的路,特别是内部连接。

我需要显示的信息分布在几个表中:Events 表,其中包含有关事件的信息,包括将其与 Venues 表和 EventCategories 列表相关联的 ID。

这是我的 SQL 查询:

from
    `Events` e
        inner join
    `EventCategories` c
        on e.ID = c.EventID
        inner join 
    `Venues` v
        on e.ID = v.ID

在我的 php 中,我这样调用每个数据单元格:

$row["Title"]   or   $row["CategoryID"]

它有效,但有几个问题。我一次只能显示一个类别。另外,如果我调用 $row["image"] 之类的东西,并且我的 Events 和 Venue 表中都有这一行,它会显示错误的行。

我没有收到任何错误消息,但我想我知道问题和解决方案,只是不知道如何编写。

我想我必须说当我放下一个变量时从哪个表调用,比如 $row["v.Title"] 将从 Venue 调用(但它不会)。我还认为我必须采用 $row["Categories"] 之类的变量并将其分解为组件,但我似乎也找不到有关如何执行此操作的任何信息。

任何帮助将不胜感激!

这是我的数据,仅显示相关部分:

EVENT
ID    Title         Time     Image      VenueID
20    Band Battle!  7:00pm   band.jpg   1

VENUES
ID    Address      Name             Image
1     123 Street   Parkland School  school.jpg

EVENT_CATEGORIES
ID    EventID    CategoryID
1     20         54
2     20         12
3     20         84

CATEGORIES
ID    Name
12    School
54    Music
84    Public

不重复:Can I concatenate multiple mysql rows into one field?

这可能不是我的问题的解决方案(尽管它可能是问题的一部分),并且它似乎没有解决如何从另一个数据库中获取多条信息,这是我问题的主要部分。

【问题讨论】:

【参考方案1】:

你可以使用聚合和GROUP_CONCAT():

SELECT 
    e.title, 
    e.time as `when`, 
    v.name as venue, 
    GROUP_CONCAT(c.name) as categories
FROM 
    Events e
    INNER JOIN Venues v ON e.VenueID = v.ID
    INNER JOIN EventCategories ec ON ec.EventID = e.ID
    INNER JOIN Categories c ON c.ID = ec.CategoryID
GROUP BY e.title, e.time, v.name

【讨论】:

感谢专线小巴!我认为这是在正确的轨道上,但仍然没有完全解决它。我将我的数据添加到问题中以澄清我在做什么。 哇,你完美地为我编写了整个代码!我对其进行了定制,以完全满足我的需要,并且效果很好!非常感谢你!!您不仅提供了有意义和有用的回应,而且我学到了一些东西。我现在知道如何使用“AS”来分配不同的名称,以及如何使用 GROUP_CONCAT 来合并数据。我对组、内部连接和整个过程也有了更好的理解。非常感谢!

以上是关于如何在三重内连接表中显示适当的数据?的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL - 三重内连接和 SUM

左连接,右连接与内连接

数据库表连接(内连接,外连接左连接右连接全连接交叉连接)

MySQL 常用的表关联:左连接右连接内连接全连接

如何从 3 个不同的表中插入内连接

数据库-联表查询