有三个我要加入的桌子。 submissionssubmissions_votesusers

我想找出总共有多少有用的投票(这是所有submissions_votes总数的总和),我已经知道了。

如果sv.user_iduser_id与正在查看的提交有关,我还想返回0或1的计数(布尔值)。 user_id传递给WHERE子句。

    SELECT s.*,
      u.username,
      u.photo as userPhoto,
      COALESCE(SUM(sv.up), 0) helpfulVotes
    FROM
      submissions s
    LEFT JOIN submissions_votes sv on s.id = sv.submission_id WHERE u.id = ?
    INNER JOIN users u
    ON s.user_id = u.id

我知道我需要额外的连接(在sv.user_id = u.id ),但是我会选择什么呢? 那我可以按sv.id吗?

编辑:

users表:

+----------------+------------------------+------+-----+-------------------+-----------------------------+
| Field          | Type                   | Null | Key | Default           | Extra                       |
+----------------+------------------------+------+-----+-------------------+-----------------------------+
| id             | int(10) unsigned       | NO   | PRI | NULL              | auto_increment              |
| email          | varchar(128)           | NO   | MUL | NULL              |                             |
| username       | varchar(23)            | NO   |     | NULL              |                             |
| type           | enum('normal','admin') | NO   |     | normal            |                             |
| about          | varchar(255)           | NO   |     | NULL              |                             |
| photo          | varchar(32)            | NO   |     | NULL              |                             |
+----------------+------------------------+------+-----+-------------------+-----------------------------+

submissions_votes表:

+---------------+---------------------+------+-----+---------+----------------+
| Field         | Type                | Null | Key | Default | Extra          |
+---------------+---------------------+------+-----+---------+----------------+
| id            | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
| submission_id | int(10) unsigned    | NO   | MUL | NULL    |                |
| when          | datetime            | NO   |     | NULL    |                |
| user_id       | int(10) unsigned    | NO   | MUL | NULL    |                |
| up            | tinyint(3) unsigned | NO   |     | NULL    |                |
| down          | tinyint(3) unsigned | NO   |     | NULL    |                |
+---------------+---------------------+------+-----+---------+----------------+

submissions表格:

+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+----------------+
| Field       | Type                                                                                                                                                                                                                                                                                | Null | Key | Default | Extra          |
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+----------------+
| id          | int(10) unsigned                                                                                                                                                                                                                                                                    | NO   | PRI | NULL    | auto_increment |
| title       | varchar(255)                                                                                                                                                                                                                                                                        | NO   | MUL | NULL    |                |
| slug        | varchar(255)                                                                                                                                                                                                                                                                        | NO   |     | NULL    |                |
| description | mediumtext                                                                                                                                                                                                                                                                          | NO   |     | NULL    |                |
| user_id     | int(11)                                                                                                                                                                                                                                                                             | NO   | MUL | NULL    |                |
| created     | datetime                                                                                                                                                                                                                                                                            | NO   |     | NULL    |                |
| type        | enum('tip','request')                                                                                                                                                                                                                                                               | NO   |     | NULL    |                |
| thumbnail   | varchar(64)                                                                                                                                                                                                                                                                         | YES  |     | NULL    |                |
| removed     | tinyint(1) unsigned                                                                                                                                                                                                                                                                 | NO   |     | 0       |                |
| keywords    | varchar(255)                                                                                                                                                                                                                                                                        | NO   |     | NULL    |                |
| ip          | int(10) unsigned                                                                                                                                                                                                                                                                    | NO   |     | NULL    |                |
+-------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------+----------------+

===============>>#1 票数:1

我认为您不需要额外的加入。 select只是一个布尔表达式:

SELECT s.*,
       u.username,
       u.photo as userPhoto,
       COALESCE(SUM(sv.up), 0) helpfulVotes,
       SUM(sv.user_id = u.id) as SubmissionUserMatches
FROM submissions s LEFT JOIN
     submissions_votes sv
     on s.id = sv.submission_id INNER JOIN
     users u
     ON s.user_id = u.id
GROUP BY s.id, u.username, u.photo;

===============>>#2 票数:1 已采纳

您可以检查sv.user_id =输入user_id使用CASESUM它(通过提交各分组)。 如果SUM为1,则输入的user_id具有提交,否则没有提交。 因此,您的输入user_id将进入CASE函数。

此外, COALESCE(SUM(sv.up), 0)要求根据选择的submissions列和users表进行分组。

以下是基于SQL Fiddle中的表的查询。

SELECT 
  s.id as submission_id,
  s.title as submission_title,
  MAX(u.email) as submission_user_email,
  COALESCE(SUM(sv.up), 0) helpfulVotes,
  SUM(CASE sv.user_id
      WHEN ? THEN 1
      ELSE 0
      END) User_Submission
FROM
  submissions s
LEFT JOIN submissions_votes sv on s.id = sv.submission_id
INNER JOIN USERS u
ON s.user_id = u.id
GROUP BY s.id, s.title;

(如果需要从“ submissions表中选择更多列,则需要将它们分组或汇总)

===============>>#3 票数:0

我使用mssql,所以不确定我的答案是否适用于mysql。 在mssql中,如果没有分组依据,问题中的查询将无法工作。 如果您确实离开了分组依据,则应在分组依据中包含srsv.submission_id。 假设您有一个约束来确保每个提交只包含submitt_vote,并且用户可以使用以下约束:

SELECT s.*,
  u.username,
  u.photo as userPhoto,
  COALESCE(SUM(sv.up), 0) helpfulVotes
  case when srsv.submission_id is null then 1 else 0 end SelfRelatedVote
FROM
  submissions s
LEFT JOIN submissions_votes sv on s.id = sv.submission_id
Left JOIN submissions_votes srsv on s.id = srsv.submission_id and s.user_id = srsv.user_id
INNER JOIN users u
ON s.user_id = u.id

===============>>#4 票数:0

检查一下

SELECT s.*,
  u.username,
  COALESCE(SUM(sv.up), 0) helpfulVotes,
  IF (srsv.submission_id is null, 1, 0)
FROM
  submissions s
LEFT JOIN submissions_votes sv on s.id = sv.submission_id
LEFT JOIN submissions_votes srsv on s.id = srsv.submission_id and s.user_id = {USER_ID}
INNER JOIN users u ON s.user_id = u.id

===============>>#5 票数:0

要获得所有提交的总数以及仅针对该用户(或其他特定于用户的聚合)的提交总数,您可以两次加入submitt_votes表,并为表的第二次连接使用不同的别名。 这将允许对用户特定的Submission_Vote详细信息进行任何汇总。

这是伪代码-GROUP BY s。*必须替换为您选择的字段并按以下字段分组:

SELECT 
     s.*
    ,u.username
    ,u.photo                        AS  userPhoto
    ,COALESCE(SUM(sv.up), 0)        AS  helpfulVotes
    ,COALESCE(SUM(sv_user.up), 0)   AS  helpfulVotes_user
FROM
    submissions s

    LEFT JOIN submissions_votes sv 
    on s.id = sv.submission_id 

    LEFT JOIN submissions_votes sv_user
    on s.id = sv_user.submission_id 

    INNER JOIN users u
    ON s.user_id = u.id

WHERE
    sv_user.user_id = @User_id
GROUP BY
     s.*
    ,u.username
    ,u.photo        

===============>>#6 票数:0

我不清楚布尔值应该表示什么,但我假设这是submitt_votes中提供的user_id是否至少有1票,因为如果submit_votes中的所有票都应该与user_id相关,则布尔值将是多余的可以看看计数。

我认为子查询是要走的路。 尝试这样的事情:

SELECT s.*,
      u.username,
      u.photo as userPhoto,
      COALESCE(
      (
        SELECT SUM(sv.up) FROM
        submission_votes sv
        WHERE sv.submission_id = s.id
      ), 0) helpfulVotes,
      (CASE 
       WHEN EXISTS (SELECT 1 
            FROM submission_votes 
            WHERE sv.submission_id = s.id 
            AND sv.user_id = ?)
       THEN 1 
       ELSE 0
       END) userSubmissionVoteExists
    FROM
    submissions s
    INNER JOIN users u ON s.user_id = u.id

  ask by bob_cobb translate from so

未解决问题?本站智能推荐:

1回复

如何获得数据库中某个项目的投票总数?

我正在研究允许用户对特定项目进行投票的功能。 我做了一个项目表和一个投票表。 投票表的投票栏将包含1或-1 在获取项目时,我假设我将对项目和票进行合并,并汇总票数列。 那是一种可扩展的方法吗? 到目前为止,我有这个查询: 但是,如何在同一查询的投票列中使用sum函数?
2回复

同一张表中的用户总数和计数

给定以下表结构,我想总结一下仅上传1个文件,2个文件,一直上传到n个文件的3个用户的数量。 我正在努力把这个查询包围着-任何指针?
1回复

优化查询:从用户的项目中获得所有投票

我这样做是因为我很难从两个表中获得结果... 基本上,首先我得到与用户相对应的所有id项目,然后计算每个项目的等级。 但是,有两种不同类型的对象项,因此我执行了2次:向您展示: 如您所愿,这是两个。.O(n ^ 2) 想要思考吗? 谢谢!
1回复

MySQL查询可根据用户投票最多的照片获得排名

现在,我正在使用此查询来获取用户的排名。 问题在于它使用了他所有照片的所有选票来获得他的排名。 我希望查询仅使用他获得最高投票的照片来计算他的排名。 这是原始查询,任何帮助将不胜感激: 我试图在预查询中设置LIMIT 0,1,但是没有用。 非常感谢。
1回复

如何获得每月* at *的注册用户总数?

假设我有一个这样的表: 用户: 我想使显示的注册用户每月数( 而不是用户每月注册的数量,但注册用户在那个时间点的总数)一个漂亮的图表。 因此,例如,返回的数据可能如下所示: 我知道如何在特定时间点注册用户数量,这很容易: 但是,我该如何编写一个查询来返回多个时
2回复

根据用户定义的限制选择外键计数

我简化了以下mysql查询,该查询计算了table1中的主键作为table2中的外键出现的次数。 我想对其进行修改,以使其仅选择高于某个阈值的计数,即,如果john smith的id在table2中出现10次,而我的阈值为20,则不会选择他的记录。
3回复

计数发生总数

我有以下查询: 这显示了以下内容: 我怎样才能只得到4号呢? 感谢您的任何帮助 :)
2回复

MySQL - 如何通过投票总数进行加入和订购?

我有这样的架构(只是试验,所以如果你有改进建议,我都是耳朵): 我试图将数据作为排行榜,以最多的票数排序结果。 我该怎么办? 我能够做左连接部分,但查询的总和和排序部分让我感到困惑。 谢谢!
5回复

检查用户是否对投票进行了投票

我创建了一个投票系统,只有登录的用户可以投票。 我有一个表,在其中存储用户外键和轮询,如下所示: 当用户投票时,我检查用户ID是否与表中的当前民意调查一起存在。 如果是,则用户已经投票。 我想知道是否应该在每个页面加载时执行此操作,以了解是否显示投票表或结果(以防用户已经投票)
1回复

仅获得具有特定联接表计数的用户

我的SqlFiddle 看起来很简单,但是对于我的一生,我似乎无法获得想要的结果。 请记住,这是在具有600万条记录的服务器上发生的,因此必须高效。 我想让加入状态为1等于3或更高的项目表的用户加入,而并非项目2上具有状态1的用户必须> = 3。 我上面的当前查询非常