Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL嵌套计数查询_Mysql_Sql_Database - Fatal编程技术网

Mysql SQL嵌套计数查询

Mysql SQL嵌套计数查询,mysql,sql,database,Mysql,Sql,Database,我有这些桌子: Discussion ---------- DiscussionID (Primary Key) Name .... UserDiscussion -------------- UserID (Primary Key) DiscussionID (Primary Key) Participated (Boolean) Bookmarked (Boolean) 我需要询问两件事: 某个用户参与的所有讨论 对于每个参与的讨论,我需要将讨论添加到书签的用户总数 以下是我当前的查询:

我有这些桌子:

Discussion
----------
DiscussionID (Primary Key)
Name
....

UserDiscussion
--------------
UserID (Primary Key)
DiscussionID (Primary Key)
Participated (Boolean)
Bookmarked (Boolean)
我需要询问两件事:

  • 某个用户参与的所有讨论
  • 对于每个参与的讨论,我需要将讨论添加到书签的用户总数
  • 以下是我当前的查询:

    SELECT d.DiscussionID, d.Name
    FROM Discussion d LEFT JOIN
         UserDiscussion ud ON ud.DiscussionID = d.DiscussionID
    WHERE ud.UserID = 1 AND ud.Participated = true;
    
    样本数据:

    Discussion:
    
    DiscussionID | Name |
    ---------------------
    1              First
    
    UserDiscussion:
    
    UserID | DiscussionID | Participated | Bookmarked |
    ===================================================
        1          1              1              1
        4          1              1              0
    
    输出应如下所示:

    讨论:[ { 讨论ID:1, 名称:“第一”, 书签计数:1 }
    ]

    您可以将in子句与子层、、和计数一起使用

    SELECT a.DiscussionID, a.Name, b.count(*)
    FROM discussion a
    INNER JOIN  UserDiscussion b 
    WHERE a.DiscussionID in (
        SELECT d.DiscussionID
        FROM Discussion d
        INNER JOIN  UserDiscussion ud ON ud.DiscussionID = d.DiscussionID
        WHERE ud.UserID = 1 AND ud.Participated = true
    )
    AND b.Bookmarked  = true;
    group by a.DiscussionID, a.Name
    

    听起来你有第一个查询,2d应该是这样的

    SELECT DiscussionID, count(UserID)
    FROM UserDiscussion        
    WHERE DiscussionID in (SELECT DiscussionID from UserDiscussion WHERE ud.UserID = 1 AND ud.Participated = true)
          AND Bookmarked = true
    GROUP BY DiscussionID;
    
    最后你需要加入他们

    与张贴的更正:

    SELECT d.DiscussionID, d.Name, BookmarkCount
    FROM Discussion d
    JOIN UserDiscussion ud ON ud.DiscussionID = d.DiscussionID
    JOIN (
    SELECT DiscussionID as DID, count(UserID) as BookmarkCount
    FROM UserDiscussion
    WHERE DiscussionID in (SELECT DiscussionID from UserDiscussion WHERE
    ud.UserID = 1 AND ud.Participated = true)
          AND Bookmarked = true
    GROUP BY DiscussionID
    ) ON d.DiscussionID=DID;
    

    一种方法是编写一个包含书签次数的视图

    创建或替换已添加书签的视图(
    讨论会,
    泰晤士报(书签)为
    选择讨论id,计数(*)
    来自用户讨论
    其中Bookmarked=true
    分组讨论\u id


    然后在主查询中,左键连接到视图。

    您可以使用临时表获得与每个讨论ID相关的书签计数

    select DiscussionID, count(Bookmarked) as 'Bookmarked'
    into #Bookmarks
    from UserDiscussion
    group by DiscussionID
    
    然后,将其连接到DiscussionID上的最后一个表,您可以将计数用作列

    SELECT d.DiscussionID, d.Name, b.Bookmarked
    FROM Discussion d LEFT JOIN
         UserDiscussion ud ON ud.DiscussionID = d.DiscussionID
    left join #Bookmarked b on ud.DiscussionID = b.DiscussionID
    WHERE ud.UserID = 1 AND ud.Participated = true;
    

    输出应该是什么样子?这是一个
    mysql
    问题还是
    postgresql
    问题?或者您正在寻找这两个系统的答案?我更新了输出应该是
    DiscussionID
    之后的
    where
    正确,还是应该是
    d.DiscussionID
    SELECT d.DiscussionID, d.Name, b.Bookmarked
    FROM Discussion d LEFT JOIN
         UserDiscussion ud ON ud.DiscussionID = d.DiscussionID
    left join #Bookmarked b on ud.DiscussionID = b.DiscussionID
    WHERE ud.UserID = 1 AND ud.Participated = true;