2014-02-11 2 views
0

Привет всем сегодня я получил, чтобы проблема ..Mysql заказ по группировке с

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

  • table2.date_start не быть пустым
  • table2.date_start равен «0000-00-00» или table2.date_start < = CURDATE()
  • table2.date_end равно «0000-00-00» или table2.date_start> = CURDATE()
  • получить высокий table2.priority, если 2 или более строк совпадают в тот же день

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

// Мой запрос

SELECT 
    psp . *, pcp . * 
FROM 
    sk_product_category_path pcp 
     left join 
    sk_product_special_price psp ON (psp.product_seq_id = pcp.product_seq_id) 
where 
    pcp.category_seq_id = 146 
     AND psp.product_seq_id IS NOT NULL 
     AND CASE 
     WHEN 
      psp.date_start IS NOT NULL 
     THEN 
      (psp.date_start = '0000-00-00' 
       OR psp.date_start <= CURDATE()) 
       AND (psp.date_end = '0000-00-00' 
       OR psp.date_end >= CURDATE()) 
     ELSE 1 = 1 
    END 
group by psp.product_seq_id 
order by psp.priority desc 

Result Came for above code: 
# product_special_price_seq_id, product_special_price, date_start, date_end, priority, product_seq_id, product_category_path_seq_id, product_seq_id, category_seq_id 
2309 123123 0000-00-00 0000-00-00 0 3196 1 3196 146 
2307 12313 0000-00-00 0000-00-00 0 3197 3 3197 146 

Result I wanted: 
# product_special_price_seq_id, product_special_price, date_start, date_end, priority, product_seq_id, product_category_path_seq_id, product_seq_id, category_seq_id 
2309 12200 0000-00-00 0000-00-00 1 3196 2 3196 146 
2307 12313 0000-00-00 0000-00-00 0 3197 3 3197 146 

// Таблица данные

CREATE TABLE IF NOT EXISTS `sk_product_category_path` (
    `product_category_path_seq_id` int(11) NOT NULL AUTO_INCREMENT, 
    `product_seq_id` int(11) NOT NULL, 
    `category_seq_id` int(11) NOT NULL, 
    PRIMARY KEY (`product_category_path_seq_id`), 
    UNIQUE KEY `product_seq_id` (`product_seq_id`,`category_seq_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 

INSERT INTO `sk_product_category_path` (`product_category_path_seq_id`, `product_seq_id`, `category_seq_id`) VALUES 
(1, 3196, 146), 
(2, 3197, 146), 
(3, 3198, 146); 

CREATE TABLE IF NOT EXISTS `sk_product_special_price` (
    `product_special_price_seq_id` int(11) NOT NULL AUTO_INCREMENT, 
    `product_special_price` bigint(20) DEFAULT NULL, 
    `date_start` date DEFAULT NULL, 
    `date_end` date DEFAULT NULL, 
    `priority` int(11) DEFAULT NULL, 
    `product_seq_id` int(11) NOT NULL, 
    PRIMARY KEY (`product_special_price_seq_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 

INSERT INTO `sk_product_special_price` (`product_special_price_seq_id`, `product_special_price`, `date_start`, `date_end`, `priority`, `product_seq_id`) VALUES 
(1, 12313, '0000-00-00', '0000-00-00', 0, 3197), 
(2, 12200, '2014-02-11', '2014-02-11', 1, 3197), 
(3, 123123, '0000-00-00', '0000-00-00', 0, 3196); 
+1

Вы используете MySQL 'группу by' расширения, что позволяет неагрегированных столбцы в' select'-запроса агрегации. Поскольку MySQL * явно * предупреждает об этом, когда значения не равны во всех строках в группе (http://dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html), я подумайте, что вы должны исправить свой запрос, чтобы избежать этого неподдерживаемого поведения. –

+0

Проблема с вашей группой ... большинство других языков SQL на самом деле выдают ошибку, а не выполняют то, что у вас есть. Оператор group должен содержать все строки в предложении select, который не является совокупностью какой-либо формы. выберите psp. *, pcp. * и только группа psp.product_seq_id не будет работать здесь ...MySQL просто глупо, чтобы попытаться запустить его в любом случае (возвращает неверные результаты вместо ошибки). – Twelfth

ответ

0

Во время GROUP BY в MySQL, он выбирает первое соответствие строки для каждой группы, если не использует статистическую функцию. Первое совпадение не всегда должно быть рядом с min (id).

Возможный запрос должен быть чем-то вроде:

SELECT t.* 
from table_name t 
inner join (
    select min(id) as id 
    from table_name t 
    group by col) as s 
on s.id = t.id 
0

Пожалуйста, найдите ниже запрос .. дайте мне знать, это ваше требование?

SELECT * FROM sk_product_special_price pspo WHERE pspo.priority IN(SELECT MAX(psp.priority) FROM sk_product_special_price psp JOIN sk_product_category_path pcp ON(pcp.product_seq_id=psp.product_seq_id) WHERE psp.date_start IS NOT NULL AND psp.date_start BETWEEN '0000-00-00' AND CURDATE() AND (psp.date_end>=CURDATE() OR psp.date_end='0000-00-00') AND pcp.product_seq_id=pspo.product_seq_id);

Я обновил дату окончания «'2014-02-11" в„2014-02-12“для моего кода выборки дата окончания> = текущая дата.

этот запрос вернет таблицу2 детали i.e таблицы sk_product_special_price для каждого продукта, основанного на значениях приоритета.

выход будет

product_special_price_seq_id, product_special_price, date_start, date_end, priority, product_seq_id 2, 12200, '2014-02-11', '2014-02-12', 1, 3197 3, 123123, '0000-00-00', '0000-00-00', 0, 3196

Смежные вопросы