2016-07-08 3 views
2

У нас есть таблица пользователей со столбцом member_end, которая, как сказано в названии, - дата окончания членства пользователей. Теперь некоторые пользователи никогда не покупают членство, поэтому поле пусто. Для некоторых пользователей это поле прошло (членство истекло). Мне нужно, чтобы сначала отсортировать активные элементы (упорядочивается по дате membership_end desc), а затем остальным пользователям в некотором независимом порядке сортировки. В основном нам нужно показать активных участников.объединить два запроса на выбор из одной и той же таблицы mysql

SELECT * FROM accounts where membership_end>=now() 
order by membership_end desc 
union 
??? 
  • Должны ли мы использовать соединение или что-то еще?
  • Что было бы вторым вопросом, чтобы избежать дубликатов?

Заранее спасибо

Ok, чтобы очистить вещи немного.

SELECT * FROM accounts where membership_end>=now() 
order by membership_end desc 

дает нам 12 активных членов, и это нормально. мы имеем следующее:

SELECT * FROM accounts where membership_end<now() 
order by id desc 

Мы просто должны объединить эти два в одном запросе. это все.

EDIT: На самом деле я понял это. Это довольно просто.

ВЫБРАТЬ идентификатор, membership_end со счетов ORDER BY membership_end> = NOW() DESC, идентификатор DESC

нет профсоюзов. никаких сложные запросы :-)

ответ

0

Вы можете сортировать нулевые значения, чтобы быть первым, чтобы вы могли избежать союзов:

SELECT membership_end FROM accounts 
where membership_end>=now() or membership_end is null 
ORDER BY [membership_end] IS NULL DESC, [membership_end] DESC 
+0

Привет там, что не будет показывать пользователям, чьи membership_end не равно нулю (например, те, чьи membership_end является 6/6/2016 – Outlaw011

+0

В самом деле, был ваш запрос в вопросе: 'membership_end> = now()'. Я просто хотел подчеркнуть, что вы можете выбрать нулевые значения и отсортировать их –

0

Если вы не хотите дубликатов, я бы рекомендовал сделать это. Я не знаю, в каком состоянии вы хотите использовать для фильтрации пользователей с нулевым membership_end подали, но если все, что я бы сделать что-то вроде этого:

SELECT membership_end FROM accounts where membership_end>=now() or membership_end is null order by membership_end desc 

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

+0

nah, пожалуйста, прочитайте выше. снова вы оставляете тех, у кого есть истекшие членства. Первоначальный запрос basibally должен быть первым с членством в будущем, вторым должен быть все остальные пользователи, отсортированные по убыванию порядка – Outlaw011

+0

@outlaw Я пытался выяснить, почему вам нужен союз вообще в течение часа - вы должны отредактировать свой вопрос, чтобы включить «второй должен быть отсортирован всеми пользователями в порядке убывания id» –

0

попробовать что-то вроде этого:

SELECT membership_end FROM table1 where membership_end>=now() 
Union all 
SELECT membership_end FROM table2 where membership_end>=now() 

это будет сочетать table1 и таблица2

Важный бит 1 поля для table1 и 1 поле только для table2. Это должно быть одно и то же.

+0

thx, но мы комбинируем та же таблица. – Outlaw011

+0

Независимо от того, что это за таблица .. это возможно сделано. Даже только один стол. просто объясните, какой результат вы хотите быть ... так что я могу вам помочь .. –

+0

отредактировал вопрос. пожалуйста, проверьте – Outlaw011

0

Два трюка здесь: 1) связывать идентификаторы с датами, создавая комбинированное поле даты и времени, исторические и нулевые значения даны в будущем, чтобы избежать совпадений с будущими датированными членами (возможно, вы захотите оттолкнуть это) 2) присвойте номер srce объединенным операторам.

/* 
create table m (id int, enddte date); 
truncate table m; 
insert into m values 
(1,null),(2,'2016-10-01'),(3,'2016-11-10'),(4,'2016-02-01'),(5,'2016-03-01'),(6,null); 
*/ 
select * from 
(
select 1 as srce,m.id,m.enddte , 
     year(m.enddte) * 10000 + month(m.enddte) * 100 + m.id as uniqueid 
from  m 
where  m.enddte >= now() 

) s 
union 
(
select 2,id,enddte, 
      year(cast('2050-01-01' as date)) * 10000 + month(cast('2050-01-01' as date)) * 100 + id 
from  m 
where  m.enddte < now() or m.enddte is null 

) 

order  by srce,uniqueid desc 

или вы могли бы сделать это без союза

select * from 
(
select case 
      when enddte >= now() then 1 
      else 2 
      end as srce, 
      id, enddte, 
      case 
      when enddte >= now() then year(m.enddte) * 10000 + month(m.enddte) * 100 + m.id 
      else year(cast('2050-01-01' as date)) * 10000 + month(cast('2050-01-01' as date)) * 100 + id 
      end as uniqueid 
from  m 
) s order  by srce,uniqueid desc 
Смежные вопросы