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

これは、3番目の「and」まで機能します。その後、結果を取得してassetTagsで検索し、5回未満しか発生しないIDのみを返すようにしています。

これが理にかなっていることを願っています、私はそれを見ることができます。UNION、Joinなどがあると思います。

4

2 に答える 2

1

count「通常の」列選択のように集計関数を混在させることはできません。
これを回避するには、aを使用して、句group 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

カウントまたは合計を適切に実行する場合は、GROUPBY句が必要です。

これはおそらくあなたが求めているものに近いです:

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 に答える