繁体   English   中英

使用count内部计数时将结果限制为一的SQL查询

[英]SQL query that limits the results to one when using count inside count

我正在尝试选择特定项目的喜欢人数。 我想到的想法是

CAST(count(uploads.ID in (SELECT uploadID from votes)) as decimal) as numberoflikes

这有效,但查询仅返回一件事。

整个查询

SELECT DISTINCT users.NAME AS username
    ,users.ID AS userID
    ,subjects.NAME AS subjectname
    ,uploads.TIME
    ,uploads.description
    ,uploads.NAME
    ,uploads.ID
    ,CASE 
        WHEN uploads.ID IN (
                SELECT uploadID
                FROM votes
                WHERE userID = 2
                )
            THEN CAST(1 AS DECIMAL)
        ELSE CAST(0 AS DECIMAL)
        END AS liked
    ,CASE 
        WHEN uploads.ID IN (
                SELECT uploadID
                FROM bookmarks
                WHERE userID = 2
                )
            THEN CAST(1 AS DECIMAL)
        ELSE CAST(0 AS DECIMAL)
        END AS bookmarked
    ,CAST(count(uploads.ID IN (
                SELECT uploadID
                FROM votes
                )) AS DECIMAL) AS numberoflikes
FROM uploads
INNER JOIN subjects ON (subjects.ID = uploads.subjectID)
INNER JOIN users ON (users.ID = uploads.userID)
INNER JOIN uploadGrades ON (uploads.ID = uploadGrades.uploadID)
INNER JOIN grades ON (grades.ID = uploadGrades.gradeID)
WHERE uploads.active = 1
    AND subjects.ID IN (
        SELECT subjectID
        FROM userSubjects
        INNER JOIN users ON (users.ID = userSubjects.userID)
        WHERE userSubjects.userID = 2
        )
    AND grades.ID IN (
        SELECT userGrades.gradeID
        FROM uploadGrades
        INNER JOIN userGrades ON (uploadGrades.gradeID = userGrades.gradeID)
        WHERE userGrades.userID = 2
        )
ORDER BY uploads.trueRating DESC;

让我们尝试简化查询,这是获得更好答案的基础

  1. 我减少了对user的初始查询,并开始upload 还要删除您已经知道如何计算的字段。

SELECT DISTINCT users.NAME AS username
    ,users.ID AS userID
    ,uploads.NAME
    ,uploads.ID
    ,CAST(count(uploads.ID IN (
                SELECT uploadID
                FROM votes
                )) AS DECIMAL) AS numberoflikes
FROM uploads
INNER JOIN users ON (users.ID = uploads.userID)
WHERE uploads.active = 1
ORDER BY uploads.trueRating DESC;
  1. 然后用LEFT JOIN添加投票以替换COUNT中的SELECT ,如果不匹配,您将得到NULL ,正如我在我的评论中所说COUNT不计算NULL's

SELECT DISTINCT users.NAME AS username
    ,users.ID AS userID
    ,uploads.NAME
    ,uploads.ID
    ,CAST(count(votes.uploadID)) AS DECIMAL) AS numberoflikes
FROM uploads
INNER JOIN users ON (users.ID = uploads.userID)
LEFT JOIN votes ON (uploads.ID = votes.uploadID)
WHERE uploads.active = 1
ORDER BY uploads.trueRating DESC;

试试这样的东西...

SELECT users.name as username, users.ID as userID, subjects.name as subjectname,
       uploads.time, uploads.description, uploads.name, uploads.ID, 
       count(userVotes.userId), count(bookmarksMade.userId),
FROM uploads 
     join subjects     on(subjects.ID = uploads.subjectID) 
     join users        on(users.ID = uploads.userID)
     join uploadGrades on(uploads.ID = uploadGrades.uploadID) 
     join grades       on(grades.ID = uploadGrades.gradeID)
     left join (select userId, uploadId from votes where userId = 2) as userVotes on uploads.id = userVotes.uploadId
     left join (select userId, uploadId from bookmarks where userId = 2) as bookmarksMade on uploads.id = bookmarksMade.uploadId
     join userSubjects on subjects.id = userSubjects.subjectID
WHERE uploads.active = 1 AND 
      userSubjects.userID = 2
ORDER BY uploads.trueRating DESC;

但是,我省去了userGrades的事情,因为您正在那里进行一个我不太了解的时髦连接(在看起来好像不是两个表中的整个主键的东西上连接两个表)。

无论如何,您确实需要去做更多类似这样的事情,或者Oropeza在他的回答中建议的内容。 直接了解您想要的东西。 该查询看起来像一个不断增长的怪物,并在需要时使用“ IN”子句添加了东西。 是时候回到绘图板上,思考一下您想要什么以及如何直接使用它。

count(uploads.ID(在(从投票中选择SELECT uploadID)中))

按上传分组。IdORDER BY uploads.true评级DESC

我设法做到了这一点。 如果我添加了该组,则它将喜欢数分成几行,然后返回更多行。 谢谢您的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM