Верните список посещающих пользователей, где посещаемость указана в одной таблице, а имя-в другой

#mysql

Вопрос:

Я создаю веб — сайт для своего киноклуба, чтобы управлять ответами на приглашения в рамках covid.

У меня есть следующий запрос:

 SELECT
    e.id, 
    e.title, 
    e.tagline, 
    e.poster_img, 
    e.youtube_link, 
    e.synpois, 
    e.description, 
    e.date AS 'when',
    e.imdb,
    e.cap,
    COUNT(r.user_id) AS users, 
    l.name,
    l.address,
    l.website 
FROM event e 
LEFT JOIN rsvp r ON e.id = r.event_id 
JOIN location l ON l.id = e.venue
WHERE e.date >= CURDATE() 
GROUP BY e.id
ORDER BY e.date ASC
 

При этом выбираются все события из таблицы « event » ( e ), в которой данные о событиях являются более новыми или равными текущим.

Я присоединяюсь к таблице « rsvp » и получаю количество пользователей, которые ответили, что они собираются на мероприятие.

Я также присоединяюсь location к таблице»», которая отображает сведения о местоположении, где демонстрируется фильм.

Все это отлично работает, я использую цикл while в PHP и создаю страницу со списком событий со всеми этими деталями. Возвращаемые данные выглядят следующим образом:

 47 | The VelociPastor (2018) | Man of the clawth. | https://shitmovie.group/wp-content/uploads/2021/05... | 7Nyb0GqAjKM | After losing his parents, a priest travels to Chin... | Please RSVP so we can track attendees... | 2021-10-23 14:30:00 | https://www.imdb.com/title/tt1843303/ | 20 | 16 | The Hive Bar | 93 Erskineville Rd, Erskineville NSW 2043 | https://thehivebar.com.au/
55 | Tammy and the T-Rex (1994) | He's The Coolest Pet In Town! | https://shitmovie.group/wp-content/uploads/2021/05... | s2TjMvBmKuo | An evil scientist implants the brain of Michael, a... | Please RSVP so we can track attendees... | 2021-10-26 18:30:00 | https://www.imdb.com/title/tt0111361/ | 20 | 14 | The Hive Bar | 93 Erskineville Rd, Erskineville NSW 2043 | https://thehivebar.com.au/
54 | Cretaceous Park | https://shitmovie.group/wp-content/uploads/2018/08... | Fifth attempt at getting this going, we'll be goin... | 2021-10-30 18:00:00 | 99 | 16 | Federal Park Picnic Shelter | 2-2A Chapman Rd, Annandale NSW 2038 | https://www.cityofsydney.nsw.gov.au/parks/federal-...
49 | Poultrygeist: Night of the Chicken Dead (2006) | Humans... the other white meat... | https://shitmovie.group/wp-content/uploads/2021/05... | uWGKWkpC6ng | Zombified chickens attempt to kill the fast-food w...  | Please RSVP so we can track attendees and if you'r... | 2021-11-27 14:30:00 | https://www.imdb.com/title/tt0462485/ | 20 | 13 | The Hive Bar | 93 Erskineville Rd, Erskineville NSW 2043 | https://thehivebar.com.au/
 

Тем не менее, я также хотел бы показать список имен для тех, кто получил приглашение, а не только количество, которое у меня есть в данный момент — возможно ли это в одном запросе (и, следовательно, просто ввести в мой цикл while для генерации html)?

Расположение таблицы для ответа на приглашение просто:

 id
user_id
event_id
waitlist
 

« id » просто является автоинкрементным int для каждой записи user_id «, » является идентификатором пользователя и « event_id » является идентификатором события. (« waitlist » вы можете игнорировать, логическое значение, если они ответили на приглашение после того, как был сбит колпачок). Расположение таблиц « event » и « location » — это почти все, что содержится в запросе, и, надеюсь, самоочевидно из названий столбцов.

Мне нужно было бы присоединиться к таблице с именем» member «, чтобы вернуть соответствующее» name «, например:

 JOIN member m ON m.id = r.user_id
 

Я просто не уверен, как вернуть все « r.user_id » в виде списка в исходном запросе, просто добавив « r.user_id » в мой запрос select, возвращает первое найденное значение, которое, как я думаю, вызывает мое» GROUP BY e.id «.

Я пытался найти решение, но неясно, как на самом деле описать мою проблему достаточно кратко, чтобы google мог вернуть что-то полезное, большинство ответов-это просто способ объединения таблиц, с которыми мне удобно (как указано выше), но не более сложный способ, которым я делаю этот SQL-запрос, чтобы упростить PHP-часть вещей.

Первоначально у меня был сайт, на котором все события переходили на другую страницу, так что тогда было легко вернуться только к одному событию, но теперь я работал над своим CSS и AJAX и перенес все на одну страницу, которая, я думаю, работает лучше (меньше кликов для пользователей, все в одном месте и, надеюсь, к тому времени, когда я закончу, будет более удобной для мобильных устройств).

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

Ответ №1:

Этот запрос, по-видимому, связан со сценарием «взрыв-взрыв». Сначала он собирает большую временную таблицу из всех JOINing , а затем сворачивает ее с помощью GROUP BY . Это, вероятно, можно ускорить с помощью:

Удалите эти две строки

 LEFT JOIN rsvp r ON e.id = r.event_id 
GROUP BY e.id
 

и заменить

     COUNT(r.user_id) AS users, 
 

Автор:

     ( SELECT COUNT(*) FROM rsvp WHERE e.id = event_id ) AS users,
 

Рассмотрите возможность использования GROUP_CONCAT() для объединения имен пользователей в одну строку.

Комментарии:

1. Спасибо, я обновил код для «взрыв-взрыв», но он выдал ошибку: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ON e.id = r.event_id) AS users, l.name, l.address, l.website...' at line 15 я посмотрю, GROUP_CONCAT() хотя, спасибо за указатели.

2. @Sam — Моя ошибка — В этом контексте WHERE вместо этого нужно ON .