2017-02-21 173 views
0

我有這些表:SQL:選擇查詢

  • 會員(IdMember,名稱,nbFollower)
  • 跟隨(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) - 舊式*逗號分隔的表格樣式列表*樣式在ANSI - ** 92 ** SQL標準(** 25年**之前)中被替換爲* proper * ANSI'JOIN'語法,並且不鼓勵使用它 –

回答

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;