#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
.