2012-04-02 3 views
0

Я здание небольшой бронирования кино система PHP веб-приложение,Присоединение и группирование SQL Результаты

База данных имеет фильм и Отображение таблицы. (Среди других, но не важно)

Отображения имеет дату и время, и каждый Отображение состоит из одного пленки

Фильм может иметь много показов

Я пытаюсь создать запрос, который получит все имя film_name, show_date и show_time, хотя я хочу сгруппировать результаты, чтобы у меня не было нескольких фильмов в результате, так как у вас может быть больше n один, показывающий на ту же дату.

У меня есть этот SQL:

SELECT f.film_name, s.showing_date, s.showing_time 
FROM film f, showing s 
WHERE f.film_id = s.film_id 
GROUP BY s.film_id 

Однако это не показывая все времена для каждого фильма, только первый. Я предполагаю, что многое упущено, и, возможно, мне следует разделить время показа на отдельную таблицу, но любая помощь будет принята с благодарностью. При необходимости я получаю больше информации и диаграмм.

Благодаря

+5

Вы говорите, что не хотите, чтобы в результате было несколько фильмов, но вы также не хотите показывать одно шоу для каждого фильма ... эти два противоречат друг другу; каковы результаты, которые вы хотели бы вернуть? –

+0

@ user1308430 лучше поместить свои таблицы с некоторыми данными и желаемым результатом, чтобы мы могли помочь, ваш вопрос не имеет ясного смысла ... –

ответ

1

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

SELECT f.film_name, group_concat(concat(s.showing_date, s.showing_time)) showings 
FROM film f, showing s 
WHERE f.film_id = s.film_id 
GROUP BY s.film_id 
+0

это только для MySQL (но все в порядке, вопрос для веб-приложения PHP) – Aprillion

+0

вопрос, очевидно, только в MySQL - предложение SELECT OP содержит неагрегированные, негрупповые поля, хотя в запросе есть предложение GROUP BY. –

+0

Я вижу, я ответил на вопрос 'mysql' – Aprillion

0

Вы не можете делать то, что вы просите сделать. Каждая строка вашего результирующего набора может отображать только одно название фильма и одно время показа. Если фильм A показывает 5 раз, то вы можете либо получить результирующий набор из пяти строк, все листинг фильма A и разные шоу, или если вы группируете фильм A, вы получите только один результат, и он перечислит первое время показа.

0

Основываясь на том, что вы сказали нам, я считаю, что то, что вы ищете, - это способ сконденсировать каждый фильм в одну строку, которая по-прежнему отображает даты и время показа. Для этого вам нужно как-то свернуть эти строки в одну строку таким образом, который не часто используется. Normall, вы бы использовали какую-то функцию в этих строках (SUM, COUNT и т. Д.), Чтобы получить агрегированные данные. Однако, похоже, вы хотите видеть фактические данные.

Чтобы сделать это, есть действительно полезные SO вопрос здесь: Concatenate many rows into a single text string?

Второй самый высокий рейтинг переговоры ответа об использовании XML PATH, которая, вероятно, будет самым чистым способом сделать это, если база данных поддерживает эту особенность. Если нет, посмотрите на принятый ответ (COALESCE). Я бы предложил включить этот тип кода в скалярную функцию, которая вернула одно поле с разделенными запятыми сеансами для вас. Затем вы можете перечислить фильм и составить список показов рядом с фильмом.

0

Извините за запутанное и, возможно, зря время, я думаю, что нашел решение, разделив время показа на отдельный стол.

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

Вероятно, есть лучший способ сделать это, но пока это будет сделано. Thanks

Смежные вопросы