如何在三重内连接表中显示适当的数据?
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 来合并数据。我对组、内部连接和整个过程也有了更好的理解。非常感谢!以上是关于如何在三重内连接表中显示适当的数据?的主要内容,如果未能解决你的问题,请参考以下文章