Выберите с несколькими, где в одном столбце - PullRequest
0 голосов
/ 31 мая 2018

У меня есть база данных с кучей собак, разделенных на разные цвета: красный, зеленый и желтый.

Name    Color
---------------
Dog1    Green
Dog2    Green
Dog3    Yellow
Dog4    Yellow
Dog5    Red
Dog6    Red
etc.

Допустим, у меня есть таблица с 100 собаками, тогда я хочу, чтобы они были разделеныв разные заезды с 4 собаками в каждой жаре.Проблема в том, что красный и зеленый кобель не могут существовать в одном и том же потоке.

Я пробовал и с базами данных MongoDB, и с базой данных SQL, но не смог выяснить, возможно ли это.

В SQL я пробовал:

SELECT * FROM Dogs 
WHERE color IN ('green', 'yellow') OR color IN ('red', 'yellow')
ORDER BY RAND() LIMIT 4;

Но тогда красный и зеленый еще можно выбрать вместе.Кто-нибудь получил несколько советов, как сделать это возможным?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Это будет звучать глупо, но вы не могли бы просто заказать по цвету?Ваш жар будет скучным, как весь зеленый, весь желтый и т. Д., Но это решит вашу проблему.

Может быть, что-то вроде

SELECT * FROM (
    SELECT *, CASE WHEN Color = 'Green' THEN 1 ELSE CASE WHEN Color = 'Yellow' THEN 2 ELSE 3 END END AS o FROM dogs 
) x ORDER BY x.o
0 голосов
/ 31 мая 2018

Предположим, ваша исходная таблица называется #temp:

    declare @holding table (name varchar(max), color varchar(max), heat int)
     declare @name varchar(max)
     declare @color varchar(max)
     declare @heat1 int
     declare @heat2 int
     declare @heat3 int
     declare @heat4 int
     declare @iterator int =1 
     while @iterator<=(Select  max(cast(replace(name,'dog','') as int))  from #temp)
     begin
     select @color= color, @name=name from #temp where name='dog'+cast(@iterator as varchar(max))
     select @heat1=count(*) from @holding where heat=1
     select @heat2=count(*) from @holding where heat=2
     select @heat3=count(*) from @holding where heat=3
     select @heat4=count(*) from @holding where heat=4

     if @color = 'red'
     begin
         if @heat1>=@heat2
         insert @holding 
         select @name, @color, 2
         else 
         insert @holding 
         select @name, @color, 1
     end

     if @color = 'yellow'
     begin
         if @heat1<=@heat2 and @heat1<=@heat3 and @heat1<=@heat4
         insert @holding 
         select @name, @color, 1
         else if @heat2<=@heat1 and @heat2<=@heat3 and @heat2<=@heat4
         insert @holding 
         select @name, @color, 2
         else if @heat3<=@heat1 and @heat3<=@heat2 and @heat3<=@heat4
         insert @holding 
         select @name, @color, 3
         else
         insert @holding 
         select @name, @color, 4
     end

     if @color = 'green'
     begin

         if @heat3>=@heat4
         insert @holding 
         select @name, @color, 4
         else 
         insert @holding 
         select @name, @color, 3

     end

     set @iterator=@iterator+1
     end 

     select * from @holding 
     order by heat, color
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...