2013-12-24 2 views
0

Обычно я не прошу «скриптов», но для механизмов, но я думаю, что в этом случае, если я увижу пример, я бы понял принципала.Как сделать несколько столбцов + подсчет в одном запросе?

У меня есть три таблицы, как показано ниже:

enter image description here

, и я хочу, чтобы получить столбцы из всех трех, плюс отсчет количества эпизодов в каждой серии и получить результат, как это :

enter image description here

в настоящее время, я открываю несколько потоков DB, ​​и я боюсь, что я получаю больше посетителей на моем сайте, что в конечном итоге реагировать очень медленно.

Любые идеи?

Большое спасибо!

ответ

2

сначала объединить все таблицы вместе, чтобы получить столбцы. Затем, чтобы получить количество, используйте функцию окна:

SELECT count(*) over (partition by seriesID) as NumEpisodesInSeries, 
     st.SeriesId, st.SeriesName, et.episodeID, et.episodeName, 
     ct.createdID, ct.CreatorName 
FROM series_table st join 
    episode_table et 
    ON et.ofSeries = st.seriesID join 
    creator_table ct 
    ON ct.creatorID = st.byCreator; 
+0

Это отличный ответ, я не выбрал его, потому что первый ответ был верен. –

+0

@MichaelSeltenreich. , , Это правильный и эффективный способ сделать то, что вы хотите сделать. –

2

Попробуйте это:

http://www.sqlfiddle.com/#!3/5f938/17

select min(ec.num) as NumEpisodes,s.Id,S.Name, 
     Ep.ID as EpisodeID,Ep.name as EpisodeName, 
     C.ID as CreatorID,C.Name as CreatorName 
from Episodes ep 
join Series s on s.Id=ep.SeriesID 
join Creators c on c.Id=s.CreatorID 
join (select seriesId,count(*) as Num from Episodes 
     group by seriesId) ec on s.id=ec.seriesID 
group by s.Id,S.Name,Ep.ID,Ep.name,C.ID,C.Name 

Благодаря Гордон

+0

Давайте посмотрим. , , вы агрегируете 'episodeID' и ожидаете' count (distinct episodeId) 'для возврата значения, отличного от 0 или 1? –

+0

Большое спасибо! –

1

Я бы сделать следующее:

SELECT (SELECT Count(*) 
     FROM episodetbl e1 
     WHERE e1.ofseries = s.seriesid) AS "#ofEpisodesInSeries", 
     s.seriesid, 
     s.seriesname, 
     e.episodeid, 
     e.episodename, 
     c.creatorid, 
     c.creatorname 
FROM seriestbl s 
     INNER JOIN creatortbl c 
       ON s.bycreator = c.creatorid 
     INNER JOIN episodetbl e 
       ON e.ofseries = s.seriesid 
2

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

SELECT SeriesCount.NumEpisodes AS #OfEpisodesInSeries, 
    S.id AS SeriesId, 
    S.name AS SeriesName, 
    E.id AS EpisodeId, 
    E.name AS EpisodeName, 
    C.id AS CreatorId, 
    C.name AS CreatorName 
FROM 
Series S 
INNER JOIN 
Episodes E 
ON E.seriesId = S.id 
INNER JOIN 
Creators C 
ON S.creatorId = C.id 
INNER JOIN 
(
    SELECT seriesId, COUNT(id) AS NumEpisodes 
    FROM Episodes 
    GROUP BY seriesId 
) SeriesCount 
ON SeriesCount.seriesId = S.id 

SQL Fiddle Схема:

CREATE TABLE Series (id int, name varchar(20), creatorId int) 

INSERT INTO Series VALUES(1, 'Friends', 1) 
INSERT INTO Series VALUES(2, 'Family Guy', 2) 
INSERT INTO Series VALUES(3, 'The Tonight Show', 1) 

CREATE TABLE Episodes (id int, name varchar(20), seriesId int) 

INSERT INTO Episodes VALUES(1, 'Joey', 1) 
INSERT INTO Episodes VALUES(2, 'Ross', 1) 
INSERT INTO Episodes VALUES(3, 'Phoebe', 1) 
INSERT INTO Episodes VALUES(4, 'Stewie', 2) 
INSERT INTO Episodes VALUES(5, 'Kevin Kostner', 3) 
INSERT INTO Episodes VALUES(6, 'Brad Pitt', 3) 
INSERT INTO Episodes VALUES(7, 'Tom Hanks', 3) 
INSERT INTO Episodes VALUES(8, 'Morgan Freeman', 3) 

CREATE TABLE Creators (id int, name varchar(20)) 

INSERT INTO Creators VALUES(1, 'Some Guy') 
INSERT INTO Creators VALUES(2, 'Seth McFarlane') 
Смежные вопросы