SQL объединяет 3 таблицы, когда 1 таблица пуста - PullRequest
0 голосов
/ 17 марта 2010

Я пытаюсь написать запрос, который соединяет 3 таблицы.

Первая таблица - это информация о каждом фестивале. Вторая таблица - количество голосов за каждый фестиваль. Третья таблица - отзывы для каждого фестиваля.

Я хочу объединить все 3 таблицы, чтобы получить все столбцы из table1, объединить table1 с table2 для festivalid, но мне также нужно подсчитать количество записей в таблице 3, которые относятся к каждому фестивалю.

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

SELECT  f.*,
        v.total,
        v.votes,
        v.festivalid,
        r.reviewcount as count
    FROM festivals f
INNER
    JOIN vote v
        ON f.festivalid = v.festivalid
INNER 
    JOIN (SELECT festivalid,
                 count(*) as reviewcount
            FROM reviews)
            GROUP BY festivalid) as r

        on r.festivalid = v.festivalid

Ответы [ 4 ]

3 голосов
/ 17 марта 2010
LEFT OUTER JOIN

, например

SELECT  f.*, 
        v.total, 
        v.votes, 
        v.festivalid, 
        r.reviewcount as count 
    FROM festivals f 
INNER 
    JOIN vote v 
        ON f.festivalid = v.festivalid 
LEFT OUTER
    JOIN (SELECT festivalid, 
                 count(*) as reviewcount 
            FROM reviews 
            GROUP BY festivalid) as r 

        on r.festivalid = v.festivalid 
2 голосов
/ 17 марта 2010
SELECT  f.*,
        v.total,
        v.votes,
        v.festivalid,
        ifnull(r.reviewcount,0) as count
    FROM festivals f
INNER
    JOIN vote v
        ON f.festivalid = v.festivalid
LEFT OUTER 
    JOIN (SELECT festivalid,
                 count(*) as reviewcount
            FROM reviews)
            GROUP BY festivalid) as r

        on r.festivalid = v.festivalid

добавлено ifnull для отображения отзывов как 0 в случае их отсутствия.

1 голос
/ 17 марта 2010

Второе соединение не должно быть внутренним соединением.

SELECT  f.*,
            v.total,
            v.votes,
            v.festivalid,
            r.reviewcount as count
        FROM festivals f
    INNER
        JOIN vote v
            ON f.festivalid = v.festivalid
    LEFT OUTER
        JOIN (SELECT festivalid,
                     count(*) as reviewcount
                FROM reviews
                GROUP BY festivalid) as r

            on r.festivalid = v.festivalid

Статья на внешних соединениях: http://msdn.microsoft.com/en-us/library/ms187518.aspx

0 голосов
/ 17 марта 2010

Попробуйте использовать внешнее объединение в таблице подсчета отзывов (r)

SELECT  f.*,
        v.total,
        v.votes,
        v.festivalid,
        r.reviewcount as count
    FROM festivals f
INNER
    JOIN vote v
        ON f.festivalid = v.festivalid
LEFT OUTER
    JOIN (SELECT festivalid,
                 count(*) as reviewcount
            FROM reviews)
            GROUP BY festivalid) as r
        on r.festivalid = v.festivalid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...