【发布时间】:2016-05-07 07:32:54
【问题描述】:
我正在尝试选择特定项目的点赞数。我想出的主意是
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. 如果您还没有这样做,请提供适当的 CREATE 和 INSERT 语句(和/或 sqlfiddle),以便我们可以更轻松地复制问题。 2. 如果您尚未这样做,请提供与步骤 1 中提供的信息相对应的所需结果集。
-
“in”子句效率极低。你真的需要重写它来使用连接。即使使用一个“in”也是冒险的;我在这里数不下五个。随着您的数据库的增长,此查询将逐渐消失。
-
查询有效。我知道 in 子句效率低下,我真的不希望数据库增长很多。但我遇到的问题是,当添加这一行“CAST(count(uploads.ID in (SELECT uploadID from votes)) as decimal) as numberoflikes”时,查询只返回一个结果。
-
所以您想计算每次上传的票数吗?我将用 joins 而不是 in 子句重写查询。
-
我认为这行不通,因为
IN是一个返回TRUE/FALSE的表达式,COUNT将计算除NULL之外的任何内容,因此将计算true and false