我有一个使用多个内部连接语句的功能查询。它结合了表格事件,场所和类别。我也有一个“收藏夹”表,我也打算包括在内,但是我在逻辑上遇到了麻烦。
我的桌子看起来像这样:
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”,这样我就可以基于是否出现此事件来输出在此列表中。 (我要在最喜欢的图标旁边放一个心形图标。)
任何帮助将不胜感激!
答案 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