Łączenie 2 zapytań MySQL w jedno i grupowanie wyników


(northwest) #1

Witam serdecznie,

Mam taką tabelę:

 

 

CREATE TABLE IF NOT EXISTS `cms_pojazd` (
  `bf_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `nazwa` varchar(85) COLLATE utf8_unicode_ci DEFAULT NULL,
  `cena` varchar(85) COLLATE utf8_unicode_ci DEFAULT NULL,
  `promowanedata` date DEFAULT NULL,
  UNIQUE KEY `id` (`bf_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

 

Chciałbym za pomocą 1 zapytania wyświetlić najpierw produkty promowane (czyli te które mają w kolumnie promowanedata "ważną datę") - a następnie pozostałe rekordy (te których promocja minęła lub nigdy nie były promowane).

Produkty promowane wiem że mogę wyświetlić poprzez: SELECT * FROM cms_pojazd WHERE DATE(promowanedata) >= DATE(NOW()) - ale czy da się połączyć to w 1 zapytanie ze zwykłymi (SELECT * FROM cms_pojazd)?

 

Bardzo proszę o pomoc,

Northwest


(Pablo_Wawa) #2

Spróbuj takiego zapytania:

SELECT * FROM cms_pojazd ORDER BY IF( DATE(promowanedata) >= DATE(NOW()), 1, 0 ) DESC

(northwest) #3

nie bardzo to działa :frowning:

może opiszę jeszcze raz co chciałbym uzyskać:

a) wyświetlenie alfabetycznie na pierwszych pozycjach promowane ogłoszenia (im dłużej ważne - tym wyżej)

b) wyświetlenie pozostałych ogłoszeń pod tymi promowanymi - alfabetycznie

 

 

Czyli:

  • Ogłoszenie premium ważne do grudnia

  • Ogłoszenie premium ważne do listopada

  • Ogłoszenie premium ważne do marca

  • “A” - ogłoszenie - nigdy nie premium

  • “B” - ogłoszenie - nigdy nie premium

  • “C” - ogłoszenie - “kiedyś” premium

  • “D” - ogłoszenie nigdy nie premium

itp


(Pablo_Wawa) #4

Dziwne - bo u mnie działa. Wrzuciłem następujące dane do MySQL:

CREATE TABLE IF NOT EXISTS `cms_pojazd` (
`bf_id` bigint(20) unsigned NOT NULL,
  `nazwa` varchar(85) COLLATE utf8_unicode_ci DEFAULT NULL,
  `cena` varchar(85) COLLATE utf8_unicode_ci DEFAULT NULL,
  `promowanedata` date DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=10 ;

INSERT INTO `cms_pojazd` (`bf_id`, `nazwa`, `cena`, `promowanedata`) VALUES
(1, 'Ogłoszenie premium ważne do grudnia', '123', '2014-12-01'),
(2, 'Ogłoszenie premium ważne do listopada', '234', '2014-11-03'),
(3, 'Ogłoszenie premium ważne do marca', '567', '2014-03-12'),
(4, '"A" - ogłoszenie - nigdy nie premium', '222', NULL),
(5, '"B" - ogłoszenie - nigdy nie premium', '444', NULL),
(6, '"C" - ogłoszenie - nigdy nie premium', '666', NULL),
(7, '"D" - ogłoszenie - nigdy nie premium', '888', NULL),
(8, 'Ogłoszenie premium ważne do lipca', '789', '2014-07-12'),
(9, 'Ogłoszenie premium ważne do września', '954', '2014-09-30');

i nieznacznie zmodyfikowałem sortowanie w podanym wcześniej zapytaniu SELECT (coby spełnić Twoje oczekiwania):

SELECT * FROM cms_pojazd ORDER BY IF( DATE(promowanedata) >= DATE(NOW()), 1, 0 ) DESC, `promowanedata` DESC, `nazwa` ASC

i uzyskuje - według mnie - właściwą kolejność danych.

 

EDIT:

 

 

Być może tu jest akurat odwrotnie, czyli na początku są ogłoszenia promowane najkrócej, poniżej masz zapytanie, które wypisze wiersze we właściwej kolejności (choć na podstawie tego co wcześniej napisałem, mógłbyś to sam sobie przerobić).

SELECT * FROM cms_pojazd ORDER BY IF( `promowanedata`, `promowanedata`, '2999-12-31' ) ASC, `nazwa` ASC