2017-02-21 4 views
0

У меня есть эти таблицы:SQL: запрос на выборку

  • Член (IdMember, имя, nbFollower)
  • Follower (IdMember, IdFollower, дата)
  • Друг (IdMember, IdFriend)
  • Фото (IdPhoto, datePhoto, IdMember)
  • Комментарий (IdPhoto, IdMember, нет, содержание)
  • Как (IdPhoto, IdMember)

нет это порядок комментария написанного членом на фото

Я хочу, чтобы выбрать имя членов, которые оставили более 3 комментариев на одной фотографии.

Я сделал это, но он не работает:

SELECT name 
FROM MEMBER M, COMMENT C, PHOTO P 
WHERE M.IdMember = C.IdMember = P.IdMember 
    AND M.IdMember IN (SELECT IdMember 
        FROM COMMENT 
        GROUP BY IdMember 
        HAVING COUNT(no) >= 3) 

Как я могу изменить мой запрос?

+1

[Плохие привычки пнуть: использование старого стиля JOIN и] (HTTP: //sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - этот старый стиль * разделенный запятыми список таблиц * стиль был заменен синтаксисом * proper * ANSI 'JOIN' в ANSI - ** 92 ** SQL Standard (** 25 лет ** назад), и его использование не рекомендуется –

ответ

1

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

SELECT name FROM MEMBER M, COMMENT C, PHOTO P 
WHERE M.IdMember = C.IdMember = P.IdMember 
AND M.IdMember IN 
(
    SELECT IdMember 
    FROM Comment 
    GROUP BY IdMember, IdPhoto 
    HAVING COUNT(*) >= 3 
) 

Но на самом деле я предпочел бы написать этот запрос, используя явное присоединяется везде:

SELECT name 
FROM MEMBER m 
INNER JOIN COMMENT c1 
    ON m.IdMember = c1.IdMember 
INNER JOIN PHOTO p 
    ON c1.IdMember = p.IdMember 
INNER JOIN 
(
    SELECT IdMember 
    FROM Comment 
    GROUP BY IdMember, IdPhoto 
    HAVING COUNT(*) >= 3 
) c2 
    ON c1.IdMember = c2.IdMember 
0

В этом случае вам не нужно, чтобы присоединиться к Photo таблицу, потому что только столбец используется из эта таблица IdPhoto, и у вас уже есть эта информация в таблице Comment.

Вы также можете непосредственно присоединиться к подзапросу таблице Member, не доводя таблицу Comment еще раз.

Как уже было сказано, вы также должны добавить IdPhoto в вашей группе по статье, чтобы подсчитать число пост от же члена на же фото

У попробовать с этим:

SELECT DISTINCT M.name 
    FROM MEMBER M, (SELECT IdMember 
       FROM COMMENT 
       GROUP BY IdMember, IdPhoto 
       HAVING COUNT(no) >= 3) C 
    WHERE M.IdMember = C.IdMember; 

Или с ANSI синтаксис:

SELECT DISTINCT M.name 
    FROM MEMBER M 
     INNER JOIN (SELECT IdMember 
       FROM COMMENT 
       GROUP BY IdMember, IdPhoto 
       HAVING COUNT(no) >= 3) C 
    ON M.IdMember = C.IdMember;