如何在内部联接语句中包含另一个表?

时间:2019-09-30 20:01:54

标签: mysql sql inner-join

我有一个使用多个内部连接语句的功能查询。它结合了表格事件,场所和类别。我也有一个“收藏夹”表,我也打算包括在内,但是我在逻辑上遇到了麻烦。

我的桌子看起来像这样:

favorites:
ID accountID eventID
1  2         14
2  2         16 
3  3         18
4  3         14
...

并继续。 该ID是唯一ID(此处不相关),accountID是与其关联的用户,eventID是已收藏的事件。

从本质上讲,我想知道代码中出现的每个事件是否都被收藏。

这是我现在的代码,可以正常工作,但尚不包含收藏夹信息。

SELECT 
    e.ID, 
    e.Title,
    v.Name as venue, 
    v.Address,
    v.Email,
    GROUP_CONCAT(c.Name SEPARATOR '  ·  ') 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
WHERE
e.ID = ".$_GET['e']." 
GROUP BY 
    e.Title, e.Start, v.Name
ORDER BY 
    e.Start ASC

我尝试过的是类似的代码

INNER JOIN favorites f ON f.eventID = e.ID

INNER JOIN favorites f ON e.ID = f.eventID

但这只会导致一切崩溃。

我玩过各种不同的游戏,但并没有取得太大的成功。我是写查询的新手,我会说这是一个复杂的查询。

我从会话变量获取accountID(如果此人已登录)。

我想做的是得到一个结果,例如“如果存在收藏夹,则运行此脚本”或“如果喜欢则返回1,如果不喜欢则返回0”,这样我就可以基于是否出现此事件来输出在此列表中。 (我要在最喜欢的图标旁边放一个心形图标。)

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

如果我了解您要执行的操作,则可以在select内添加一个case语句,以查看事件ID在表中是否是偶数(如果已被收藏)。

SELECT 
    e.ID, 
    e.Title,
    v.Name as venue, 
    v.Address,
    v.Email,
    GROUP_CONCAT(c.Name SEPARATOR '  ·  ') as Categories,
    CASE WHEN EXISTS(SELECT 1 FROM Favorites WHERE EventID = e.ID) THEN 'Yes' ELSE 'No' END AS HasBeenFavorited
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
WHERE
    e.ID = ".$_GET['e']." 
ORDER BY 
    e.Start ASC

答案 1 :(得分:0)

我认为您所需要的就是在您的原始查询中添加“左联接”,如下所示:

SELECT 
    e.ID, 
    e.Title,
    v.Name as venue, 
    v.Address,
    v.Email,
    GROUP_CONCAT(c.Name SEPARATOR '  ·  ') as Categories,
    CASE WHEN F.EventID IS NULL THEN 0  ELSE 1 END AS HasFavorite
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
    LEFT JOIN Favorites F on F.EventID = e.ID
WHERE
    e.ID = ".$_GET['e']." 
ORDER BY 
    e.Start ASC