Как мне включить другую таблицу с внутренним оператором соединения? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть функциональный запрос, использующий несколько операторов внутреннего соединения. Он отлично сочетает в себе таблицы событий, мест и категорий. У меня также есть таблица «Избранное», которую я планирую включить, но у меня возникают проблемы с логикой.

Моя таблица выглядит так:

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

ипродолжается. Идентификатор - это уникальный идентификатор (здесь не имеет значения), accountID - это пользователь, с которым он связан, а eventID - это событие, которое было добавлено в избранное.

По сути, я хочу знать, что для каждого события Iприсутствует в моем коде, был ли он одобрен.

Это мой код прямо сейчас, который работает, но еще не содержит информацию о избранном.

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 голосов
/ 30 сентября 2019

Я думаю, что все, что вам нужно, это добавить «левое соединение» к исходному запросу, например:

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
0 голосов
/ 30 сентября 2019

Если я понимаю, что вы пытаетесь сделать, вы можете добавить оператор выбора внутри выбора, чтобы увидеть, есть ли идентификатор события даже в таблице, если это так, то оно было добавлено.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...