2016-09-20 3 views
2

Я застрял в SQL-запросе. Я знаю что делать, но я не могу понять как. Итак, вот схема нужна:Запрос на группировку Sql

Movie (название, директор, год, жанр, скорость);

TITLE   DIRECTOR  YEAR  GENRE  RATE 
Fight club Fincher  1999  Action  4.5 
Vertigo  Hitchock  1958  Drama  5 
Donnie darko Kelly  2001  Thriller 3.5 

Видео (название, директор, colloc);

TITLE   DIRECTOR COLLOC 
Fight club  Fincher  3877 
Fight club  Fincher  3878 
Vertigo  Hitchcock 5431 
Vertigo  Hitchcock 5432 
Donnie darko Kelly  9986 

Аренда (colloc, dateRent, клиент, dateReturn);

COLLOC  DATERENT  CUSTOMER  DATERETURN 
    3877  2016-05-02 324   2016-05-04 
    3877  2016-05-20 365   2016-05-20 
    3878  2016-04-11 876   2016-04-12 
    3878  2016-06-06 112   2016-06-08 
    ...   ...   ...   ... 
    ...   ...   ...   ... 
    9986  2016-02-24 443   2016-02-28 

А вот запрос:

Список, для каждого фильма, сколько видео было арендовано по крайней мере в два раза.

(Примечание: в магазине обычно больше видео - dvds, vhs и т. Д. - для каждого фильма).

Мой подход заключается в следующем: Я хотел бы начать с этого простого запроса

SELECT colloc, title, director, COUNT(colloc) AS rentNumber 
FROM Rent 
NATURAL JOIN Video 
GROUP BY colloc 

Чтобы отобразить что-то вроде этого:

COLLOC TITLE   DIRECTOR RENTNUMBER 
3877  Fight club Fincher  2 
3878  Fight club Fincher  2 
5432  Vertigo  Hitchcock 2 
5431  Vertigo  Hitchcock 1 
9986  Donnie darko Kelly  1 

Для того, чтобы добраться до этого:

TITLE   DIRECTOR  VIDEOSNUMBER 
Fight club  Fincher  2 
Vertigo  Hitchcock  1 
Donnie darko Kelly   0 

Но я пропустил этот последний шаг, я не могу правильно использовать GROUP BY/HAVING. Нет успеха даже с подзапросами. Я пытался использовать другой подход, но у меня не было ничего хорошего, поэтому любые советы были бы оценены.

Спасибо.

Редактировать: ПРИМЕЧАНИЕ. Нет необходимости использовать таблицу Movie в запросе. Я поставил его там, чтобы объяснить, что в фильме может быть более одного видео. Добавлены примеры таблиц. Первичные ключи выделены жирным шрифтом.

РЕШЕНИЕ: Благодаря вашим советам я нашел решение (если честно, это частично, так как он выпускает все фильмы, для которых нет видео, снятых как минимум 2 раза). Во всяком случае, здесь:

SELECT title, director, COUNT(title) AS videosNumber 
FROM (SELECT colloc, title, director, COUNT(colloc) AS rentNumber 
     FROM rent NATURAL JOIN video 
     GROUP BY colloc 
    ) X 
WHERE rentNumber > 1 
GROUP BY title 
+0

я думаю, вы должны GROUP BY titolo – Kasnady

+0

Общее GROUP BY правило гласит: если предложения GROUP BY указано, каждая ссылка на столбец в списке выбора должны либо определить столбец группировки или аргумент функции набора! – jarlh

+1

Добавьте пример данных таблицы, создав указанный ожидаемый результат! – jarlh

ответ

0

Попробуйте

SELECT 
-- if you want to add colloc, uncomment below 
-- r.colloc as COLLOC 
m.title as TITLE, 
m.director as DIRECTOR, 
COUNT(r.colloc) as VIDEOSNUMBER 

FROM movie m 
LEFT JOIN video v ON m.title = v.title 
LEFT JOIN rent r ON v.colloc = r.colloc 
GROUP BY TITLE 
+2

Недопустимая группа. Возникнет ошибка в новых версиях MySQL. (И возвращать произвольные результаты в более ранних версиях.) – jarlh

+0

Независимо от ошибки в более новых версиях MySQL он выводит тот же результат Nebi и @ unnikrishnan-r. – Zeno

+0

@ Zeno Вы изменили имя таблицы на свой? Вы можете показать нам свою ошибку? – Kasnady

0

тестировал:

SELECT m.TITLE, m.DIRECTOR, COALESCE(rs.Rentnumber, 0) AS VIDEOSNUMBER 
FROM Movie AS m 
LEFT JOIN 
(
    SELECT 
     --r.colloc, -- if you want to see r.colloc 
     v.TITLE, 
     v.DIRECTOR, 
     COUNT(v.TITLE) AS Rentnumber 
    FROM Video AS v 
    LEFT JOIN Rent as r on v.colloc = r.colloc 
    GROUP BY r.colloc, v.TITLE, v.DIRECTOR 
) AS rs ON m.title = rs.title AND m.director = rs.director 
Group by m.title, m.director 
+0

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

+0

ОК, чем вы действительно хотите, чтобы номер колла в группе по – Nebi

+0

@zeno обновил запрос. Не проверял. Они могут быть более чистым решением в MySQL. В SQL-SERVER для этого используются Window-Functions. В MySQL вы можете попробовать «Group_concat». – Nebi

0

Попробовать он ниже сценария. Вы должны включить столбцы в список SELECT в пункт GROUP BY.

SELECT TITLE,DIRECTOR,MIN(VIDEOSNUMBER) VIDEOSNUMBER 
FROM (
     SELECT v.colloc,v.TITLE,v.DIRECTOR ,COUNT(r.colloc) VIDEOSNUMBER  
     FROM Video v 
     LEFT JOIN Rent r on v.colloc=r.colloc 
     GROUP BY v.TITLE,v.DIRECTOR,v.colloc)t 
GROUP BY TITLE,DIRECTOR 
+0

Он выводит тот же результат запроса @Nebi. – Zeno

+0

Попробуйте с обновленным запросом. –

+0

Не точный вывод, но я думаю, что это правильный способ подойти к проблеме, «вложив» таблицу результатов в предложение from. Благодарю. – Zeno

1

Попробуйте этот запрос:

SELECT t1.TITLE, 
     t1.DIRECTOR, 
     COALESCE(t2.VIDEOSNUMBER, 0) AS VIDEOSNUMBER 
FROM Movie t1 
LEFT JOIN 
(
    SELECT v.TITLE, COUNT(DISTINCT r.COLLOC) AS VIDEOSNUMBER 
    FROM Rent r 
    INNER JOIN Video v 
     ON r.COLLOC = v.COLLOC 
    GROUP BY v.TITLE 
) t2 
    ON t1.TITLE = t2.TITLE 
ORDER BY COALESCE(t2.VIDEOSNUMBER, 0) DESC 
Смежные вопросы