2016-07-19 7 views
2

Я хочу получить данные с заказом по дате. Я использую союз.Mysql multiple ORDER BY with UNION

Я рассмотрел приведенный ниже адрес. Но с этим я не понимаю.

mysql order by with union doesn't seem to work

Мой запрос

(SELECT n.nid, 
     Max(na.gid)     AS mid, 
     fav.field_date_posted_value AS pdate 
FROM `node` AS n 
JOIN nodeaccess AS na 
    ON na.nid = n.nid 
LEFT JOIN field_data_field_date_posted AS fav 
     ON fav.entity_id = n.nid 
WHERE (na.gid IN(10, 11) 
      AND (n.status = '1') 
      AND (n.type IN ('article', 'blog', 'events', 'media', 
          'press_releases', 'expert_speak', 'feature', 
          'case_study', 
          'news', 'the_igtb_series', 'trend', 'white_paper') 
      )) 
GROUP BY n.nid 
ORDER BY pdate DESC) 

UNION 

(SELECT n.nid, 
     Max(na.gid)     AS mid, 
     fav.field_date_posted_value AS pdate 
FROM `node` AS n 
JOIN nodeaccess AS na 
    ON na.nid = n.nid 
LEFT JOIN field_data_field_date_posted AS fav 
     ON fav.entity_id = n.nid 
WHERE (na.gid IN(2) 
      AND (n.status = '1') 
      AND (n.type IN ('article', 'blog', 'events', 'media', 
          'press_releases', 'expert_speak', 'feature', 
          'case_study', 
          'news', 'the_igtb_series', 'trend', 'white_paper') 
      )) 
GROUP BY n.nid 
ORDER BY pdate DESC) 
LIMIT 
10 

Мой результат

+-------+------+---------------------+ 
| nid | mid | pdate    | 
+-------+------+---------------------+ 
| 12472 | 10 | 2015-05-11 00:00:00 | 
| 12473 | 10 | 2015-04-03 00:00:00 | 
| 12475 | 10 | 2015-06-08 00:00:00 | 
| 12476 | 10 | 2015-12-15 01:55:48 | 
| 12477 | 10 | 2014-06-30 00:00:00 | 
| 12478 | 10 | 2013-12-26 00:00:00 | 
| 12482 | 10 | 2014-02-02 00:00:00 | 
| 12483 | 10 | 2014-09-01 00:00:00 | 
| 12484 | 10 | 2015-12-04 00:00:00 | 
| 12485 | 10 | 2015-08-14 00:00:00 | 
+-------+------+---------------------+ 

В приведенном выше URL заказа дата не работает. Я не хочу делать заказ как обычным. Мне нужен отдельный порядок для обоих выбранных запросов (используется в UNION).

Update 2:

(SELECT n.nid, max(na.gid) as mid, fav.field_date_posted_value as pdate FROM `node` as n 
JOIN nodeaccess AS na ON na.nid = n.nid 
LEFT JOIN field_data_field_date_posted AS fav ON fav.entity_id = n.nid 
WHERE (na.gid IN(10,11) AND (n.status = '1') AND (n.type IN ('article','blog', 'events', 'media', 'press_releases', 'expert_speak', 'feature', 'case_study', 'news', 'the_igtb_series', 'trend', 'white_paper'))) 
GROUP BY n.nid 
ORDER BY pdate DESC) 

UNION 

(SELECT n.nid, max(na.gid) as mid, fav.field_date_posted_value as pdate FROM `node` as n 
JOIN nodeaccess AS na ON na.nid = n.nid 
LEFT JOIN field_data_field_date_posted AS fav ON fav.entity_id = n.nid 
WHERE (na.gid IN(2) AND (n.status = '1') AND (n.type IN ('article','blog', 'events', 'media', 'press_releases', 'expert_speak', 'feature', 'case_study', 'news', 'the_igtb_series', 'trend', 'white_paper'))) 
GROUP BY n.nid 
ORDER BY pdate DESC) 

ORDER BY pdate DESC LIMIT 10 

выше дает результат ниже.

+-------+------+---------------------+ 
| nid | mid | pdate    | 
+-------+------+---------------------+ 
| 12789 | 11 | 2016-09-26 00:00:00 | 
| 12826 | 2 | 2016-07-13 00:00:00 | 
| 12845 | 2 | 2016-07-05 00:00:00 | 
| 12823 | 10 | 2016-06-21 00:00:00 | 
| 12822 | 2 | 2016-06-17 00:00:00 | 
| 12821 | 10 | 2016-06-07 00:00:00 | 
| 12635 | 10 | 2016-06-07 00:00:00 | 
| 12821 | 2 | 2016-06-07 00:00:00 | 
| 12633 | 10 | 2016-05-25 02:19:29 | 
| 12548 | 10 | 2016-05-20 00:00:00 | 
+-------+------+---------------------+ 

В результате я не хочу, чтобы изменить порядок столбец «середине»

+0

вы можете добавить 'ORDER BY бновить DESC' в конце запрос перед 'LIMIT 10' – mwafi

+0

Можете ли вы показать нам, что вы хотите получить? –

+0

@mwafi Спасибо за ваш комментарий. Я пробовал это, но не даю ожидаемого результата. –

ответ

1

Попробуйте

SELECT n.nid, max(na.gid) as mid,fav.field_date_posted_value, UNIX_TIMESTAMP(fav.field_date_posted_value) as pdate, 1 as ob FROM `node` as n 
JOIN nodeaccess AS na ON na.nid = n.nid 
LEFT JOIN field_data_field_date_posted AS fav ON fav.entity_id = n.nid 
WHERE (na.gid IN(10,11) AND (n.status = '1') AND (n.type IN ('article','blog', 'events', 'media', 'press_releases', 'expert_speak', 'feature', 'case_study', 'news', 'the_igtb_series', 'trend', 'white_paper'))) 
GROUP BY n.nid 


UNION ALL 

SELECT n.nid, max(na.gid) as mid,fav.field_date_posted_value, UNIX_TIMESTAMP(fav.field_date_posted_value) as pdate, 2 as ob FROM `node` as n 
JOIN nodeaccess AS na ON na.nid = n.nid 
LEFT JOIN field_data_field_date_posted AS fav ON fav.entity_id = n.nid 
WHERE (na.gid IN(2) AND (n.status = '1') AND (n.type IN ('article','blog', 'events', 'media', 'press_releases', 'expert_speak', 'feature', 'case_study', 'news', 'the_igtb_series', 'trend', 'white_paper'))) 
GROUP BY n.nid 

ORDER BY ob ASC, pdate DESC 

Установленный порядок по дате только основания или группы

+0

Работает как и ожидалось. Благодаря @Nandakumar –

1

Вам нужно обернуть результат объединения двух отдельных заявлений и заказать его по pdate.

, как показано ниже:

SELECT * from 
    (
     (SELECT n.nid, max(na.gid) as mid, fav.field_date_posted_value as pdate FROM `node` as n 
     JOIN nodeaccess AS na ON na.nid = n.nid 
     LEFT JOIN field_data_field_date_posted AS fav ON fav.entity_id = n.nid 
     WHERE (na.gid IN(10,11) AND (n.status = '1') AND (n.type IN ('article','blog', 'events', 'media', 'press_releases', 'expert_speak', 'feature', 'case_study', 'news', 'the_igtb_series', 'trend', 'white_paper'))) 
     GROUP BY n.nid 
     ORDER BY pdate DESC) 

     UNION 

     (SELECT n.nid, max(na.gid) as mid, fav.field_date_posted_value as pdate FROM `node` as n 
     JOIN nodeaccess AS na ON na.nid = n.nid 
     LEFT JOIN field_data_field_date_posted AS fav ON fav.entity_id = n.nid 
     WHERE (na.gid IN(2) AND (n.status = '1') AND (n.type IN ('article','blog', 'events', 'media', 'press_releases', 'expert_speak', 'feature', 'case_study', 'news', 'the_igtb_series', 'trend', 'white_paper'))) 
     GROUP BY n.nid 
     ORDER BY pdate DESC) 
    ) as UnionTable 
ORDER BY pdate DESC limit 10 
+1

Вы уверены, что эту работу? Вам не нужен другой заголовок 'SELECT'? и поместить псевдоним в подзапрос? –

+0

@JuanCarlosOropeza Спасибо! –

+0

@JuanCarlosOropeza Спасибо за ваш ответ. Я пробовал это, но не работал. См. Мой вопрос. Обновление 2. –

1

Я не уверен, почему union даже необходимо. И я не совсем понимаю, каким должно быть значение третьего столбца, потому что это не аргумент функции агрегации и не находится в group by.

Тем не менее, я хотел бы написать запрос как:

(SELECT n.nid, max(na.gid) as mid, fav.field_date_posted_value as pdate 
FROM `node` n JOIN 
     nodeaccess na 
     ON na.nid = n.nid LEFT JOIN 
     field_data_field_date_posted fav 
     ON fav.entity_id = n.nid 
WHERE (na.gid IN(10,11) AND (n.status = '1') AND (n.type IN ('article','blog', 'events', 'media', 'press_releases', 'expert_speak', 'feature', 'case_study', 'news', 'the_igtb_series', 'trend', 'white_paper'))) 
GROUP BY n.nid 
ORDER BY pdate DESC 
LIMIT 10 
) UNION ALL 
(SELECT n.nid, max(na.gid) as mid, fav.field_date_posted_value as pdate 
FROM `node` n JOIN 
    nodeaccess na 
    ON na.nid = n.nid LEFT JOIN 
    field_data_field_date_posted fav 
    ON fav.entity_id = n.nid 
WHERE (na.gid IN(2) AND (n.status = '1') AND (n.type IN ('article','blog', 'events', 'media', 'press_releases', 'expert_speak', 'feature', 'case_study', 'news', 'the_igtb_series', 'trend', 'white_paper'))) 
GROUP BY n.nid 
ORDER BY pdate DESC 
LIMIT 10 
) 
ORDER BY pdate DESC 
LIMIT 10; 

Примечания:

  • Limit подзапросов до 10 строк. Зачем обрабатывать больше данных, чем необходимо?
  • Использовать ORDER BY после подзапросов, чтобы заказать все результаты.
  • Используйте UNION ALL вместо UNION, поэтому ваш запрос не несет накладных расходов на удаление дубликатов.
1

Создайте еще один столбец, так что вы можете заказать каждый UNION запрос

Sql Fiddle Demo

SELECT '1' as grp, 1 as ID 
UNION 
SELECT '1' as grp, 3 as ID 
UNION 
SELECT '1' as grp, 2 as ID 
UNION 
SELECT '1' as grp, 5 as ID 
UNION 
SELECT '2' as grp, 4 as ID 
UNION 
SELECT '2' as grp, 7 as ID 
UNION 
SELECT '2' as grp, 2 as ID 
UNION 
SELECT '2' as grp, 5 as ID 

ORDER BY grp, ID 

OUTPUT

enter image description here

1

Два дополнительных пункта ORDER BY могут быть удалены.Фактически, несколько БД только для того, чтобы поставить предложение ORDER BY OR LIMIT перед заявлением Союза. Вы можете попробовать ниже:

(
(SELECT n.nid, max(na.gid) as mid, fav.field_date_posted_value as pdate FROM `node` as n 
JOIN nodeaccess AS na ON na.nid = n.nid 
LEFT JOIN field_data_field_date_posted AS fav ON fav.entity_id = n.nid 
WHERE (na.gid IN(10,11) AND (n.status = '1') AND (n.type IN ('article','blog', 'events', 'media', 'press_releases', 'expert_speak', 'feature', 'case_study', 'news', 'the_igtb_series', 'trend', 'white_paper'))) 
GROUP BY n.nid 
) 

UNION 

(SELECT n.nid, max(na.gid) as mid, fav.field_date_posted_value as pdate FROM `node` as n 
JOIN nodeaccess AS na ON na.nid = n.nid 
LEFT JOIN field_data_field_date_posted AS fav ON fav.entity_id = n.nid 
WHERE (na.gid IN(2) AND (n.status = '1') AND (n.type IN ('article','blog', 'events', 'media', 'press_releases', 'expert_speak', 'feature', 'case_study', 'news', 'the_igtb_series', 'trend', 'white_paper'))) 
GROUP BY n.nid) 
) order by pdate DESC limit 10