0

我不确定提出这个问题的最佳方式,所以提前感谢您处理我的困惑。

这是我提出的查询:

SELECT a.id FROM assets a, courseAssets ca, courses c, assetTags at WHERE c.courseUser = {$userId} AND c.id = ca.courseID and ca.assetID = a.id AND count(at.assetID = a.id) <5

这一直有效到第三个“and”。在那之后,我试图获取结果并在assetTags中找到它们,并且只返回出现少于5次的ID。

希望这是有道理的,我可以在脑海中看到它,只是不确定如何到达那里。我确定有一个 UNION,Join 什么的。

4

2 回答 2

1

您不能将聚合函数count与“普通”列选择混合使用。
为避免这种情况,请使用 agroup by并将聚合条件放在having子句中。

SELECT a.id 
FROM assets a
inner join courseAssets ca on ca.assetID = a.id
inner join courses c on c.id = ca.courseID
inner join assetTags at on at.assetID = a.id
group by a.id
having count(distinct at.assetID) < 5

顺便说一句,习惯连接语法是最佳实践。

于 2013-02-25T13:07:54.540 回答
0

如果要正确进行计数或求和,则需要 GROUP BY 子句。

这可能接近您所追求的:

SELECT id
FROM (
SELECT a.id, count(ast.assetID) AS counter
FROM assets a, courseAssets ca, courses c, assetTags ast 
WHERE c.courseUser = {$userId} 
    AND c.id = ca.courseID 
    AND ca.assetID = a.id 
    AND ast.assetID = a.id
GROUP BY a.id
) temp
WHERE temp.counter < 5

原谅任何错误。我还将assetTags别名“at”更改为“ast”只是为了避免保留字......

于 2013-02-25T14:03:59.157 回答