【问题标题】: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?

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

【问题讨论】:

    标签: php mysql sql join


    【解决方案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 来合并数据。我对组、内部连接和整个过程也有了更好的理解。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2012-12-24
    • 2017-12-20
    • 1970-01-01
    相关资源
    最近更新 更多