2016-11-15 3 views
0

Представьте себе "дом" таблица в базе данных имеет 7 внешних ключей:Как заказать инструкцию SELECT по количеству соответствующих внешних ключей?

  • Адрес
  • Цена
  • Население
  • Размер
  • школы
  • Магазины
  • Транспорт

(Некоторые отношения на самом деле от многих до многих отношений).

Я хочу показать список домов, отсортированных по убыванию по количеству соответствующих внешних ключей.

Наилучший результат будет заключаться в том, что все 7 внешних ключей имеют значения, в том числе большое количество значений во многих отношениях.

Следующим лучшим результатом будет то, что все 7 внешних ключей имеют значения, но имеют меньшее количество значений во многих отношениях.

Следующим лучшим результатом будет то, где 6 внешних ключей имеют значение.

Следующим лучшим результатом будет то, где 5 внешних ключей имеют значение.

И так далее, пока только 1 из внешних ключей имеет значение.

Есть ли способ сделать этот тип сортировки в SQL?

спасибо.

+0

Я попытался использовать ужасный вложенный «случай, когда что-то тогда 0 еще один конец» ... –

+1

Может ли вы зарегистрировано не менее долю фиктивных данных в табличной форме и ваш запрос, попытались огурчиком или что-то ? –

ответ

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 

Так, чем больше внешнего ключа подключили запись (ы), тем выше стоимость будет.

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 
Смежные вопросы