我有这个查询:
select * from mbk_file
where user_id = $1
order by (
select count(file_id) from mbk_file_label
where file_id = mbk_file.id
) DESC
我注意到将 DESC 更改为 ASC 并没有改变顺序,尽管我希望它应该如此。所以这告诉我子查询并没有真正做任何有用的事情。
我有这些表:
-----mbk_file------
id bigint
-----mbk_file_label-----
id bigint
file_id (from above table)
第一张和第二张桌子之间有一对多。我认为我不需要 group by 子句,我只需要计算 file_id 来自第一个表的所有行吗?
我想我需要做这样的事情:
select *, (
select count(file_id) from mbk_file_label
where file_id = mbk_file.id
) as xxx
from mbk_file
where user_id = $1
order by xxx DESC
但我仍然不明白 file_id 将如何因行而异..
让我用数据解释一下:
---mbk_file---- // has 3 records total
1
2
3
---mbk_file_label
1 1
1 2
1 3
1 4 // file 1 has 4 matching records
2 1
2 3 // file 2 has 2 matching records
3 2
3 3
3 4 // file 3 has 3 matching records
所以我想做的是根据 mbk-file-label 中有多少匹配记录对 mbk-files 进行排名。
因此 mbk 文件的选择结果的排名/顺序将是:
1
3
2
从 1 开始,有 4 条匹配记录,文件 2 有 2 条匹配记录,文件 3 有 3 条匹配记录。我希望这是有道理的,因为它非常简单,但我不知道如何创建查询 fml :(
你
ORDER BY
的是这样的:将
count
返回一个(常量)整数,例如 300。这意味着您实际上是在说ORDER BY 300 DESC
(其中 300 是指定 user_id 的 file_id 值的数量)。这不是使用列进行排序,而是使用常量。按常数排序什么都不做。您可能希望根据列中的值(或从列派生的计算)对结果进行排序,但这不是查询所做的