如何通过匹配外键的数量来订购SELECT语句?

时间:2016-11-15 06:53:49

标签: sql django

想象一下,数据库中的“house”表有7个外键:

  • 位置
  • 价格
  • 人口
  • 尺寸
  • 学校
  • 商店
  • 运输

(有些关系实际上是多对多关系)。

我想显示一个房屋列表,按照匹配的外键数量的降序排序。

最好的结果是所有7个外键都有值,包括多对多关系中的大量值。

下一个最好的结果是所有7个外键都具有值,但在多对多关系中具有较少的值。

下一个最好的结果是6个外键有一个值。

下一个最好的结果是5个外键有一个值。

依此类推,直到只有一个外键有值。

有没有办法在SQL中进行这种类型的排序?

谢谢。

2 个答案:

答案 0 :(得分:0)

这不是很简单,因为你必须检查所有外键,所以你必须告诉所有这7个条件。 您可以通过例如:。

进行排序
select
    ...
from
    thistable
order by
    case when exists (select 1 from table1 where id=thistable.fk1) then 1 else 0 end + 
    case when exists (select 1 from table2 where id=thistable.fk2) then 1 else 0 end + 
    ...
    desc

因此,连接记录的外键越多,该值就越高。

答案 1 :(得分:0)

检查外键是否有值并不太棘手。尝试这样的事情:

SELECT ...
  FROM MyTable
  ORDER BY Case When fk1 Is Not Null Then 1 Else 0 End +
    Case When fk2 Is Not Null Then 1 Else 0 +
    ... DESC ,
    (Select Count(*) From ManyToManyTable1 Where MyTableID = MyTable.ID) +
    (Select Count(*) From ManyToManyTable2 Where MyTableID = MyTable.ID) DESC