Mysql 使用count-inside-count时将结果限制为1的SQL查询

Mysql 使用count-inside-count时将结果限制为1的SQL查询,mysql,join,count,Mysql,Join,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

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

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;

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

我将初始查询简化为用户,然后上传开始。同时删除您已经知道如何计算的字段。

然后用LEFT JOIN添加投票,以替换计数中的SELECT,这样如果不匹配,您将得到NULL,正如我在评论中所说,COUNT不计算NULL


试试这样的

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的内容,因为你在做一个时髦的连接,我真的不理解在某个表上连接两个表,而这看起来不是两个表上的全部主键。
不管怎么说,你真的需要做更多类似的事情,或者奥罗佩扎在回答中的建议。更直接地了解你想要什么。这个查询看起来像是一个怪物,它一直在增长,并在您需要的时候使用in子句添加内容。是时候回到绘图板上,想想你想要什么,以及如何直接得到它。

countuploads.ID在选择uploadID from vows as numberoflikes中

按上载分组。Id按上载排序。trueRating DESC


我设法做到了这一点。如果我在那之前添加了组,它会将numberoflikes分成几行,并返回多行。谢谢你的帮助

我想我会想扔掉这个,重新开始。如果你喜欢,考虑下面简单的两步行动:1。如果您还没有这样做,请提供适当的CREATE和INSERT语句和/或SQLFIDLE,以便我们可以更轻松地复制问题。2.如果尚未这样做,请提供与步骤1中提供的信息相对应的所需结果集。in子句效率极低。你真的需要重写它来使用连接。即使使用一个是危险的;我在这里数到不少于五个。随着数据库的增长,此查询将逐渐变为爬网。此查询可以正常工作。我知道in子句效率很低,我真的不希望数据库增长很多。但我遇到的问题是,当添加SELECT uploadID from VOUTES as decimal as numberoflikes中的CASTcountuploads.ID这一行时,查询只返回一个结果。那么您希望每次上载的票数是多少?我将用连接而不是in子句重写该查询。我认为这行不通,因为in是一个返回TRUE/FALSE的表达式,COUNT将计算任何不为NULL的值,因此将计算TRUE和FALSE。我尝试了内部连接版本,但仍然得到相同的错误。它只返回一行数据。然后是另外一件事,你能在中创建一个工作样本吗?这个查询只返回一行。谢谢你的努力+
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;