2015-05-28 5 views
2

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

В основном у меня есть страница с полным списком продуктов, а некоторые продукты перечислены дважды, трижды или даже раз. По очень веской причине, но в любом случае.

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

$listing_sql = "SELECT DISTINCT " . $select_column_list . " 
p.products_id, p.products_type, p.master_categories_id, 
p.manufacturers_id, p.products_price, p.products_tax_class_id, 
pd.products_description, pd.products_name, IF(s.status = 1, 
s.specials_new_products_price, NULL) as specials_new_products_price, 
IF(s.status =1, s.specials_new_products_price, 
p.products_price) as final_price, p.products_sort_order, 
p.product_is_call, p.product_is_always_free_shipping, 
p.products_qty_box_status"; 

$listing_sql .= " FROM " . TABLE_PRODUCTS . " p" . 

" LEFT JOIN " . TABLE_SPECIALS . " s on p.products_id = s.products_id" . 
" LEFT JOIN " . TABLE_PRODUCTS_DESCRIPTION . " pd on p.products_id = 
pd.products_id" . 
" JOIN " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c on p.products_id = 
p2c.products_id" . 
($filter_attr == true ? " JOIN " . TABLE_PRODUCTS_ATTRIBUTES . " p2a on 
p.products_id = p2a.products_id" . 
" JOIN " . TABLE_PRODUCTS_OPTIONS . " po on p2a.options_id = 
po.products_options_id" . 
" JOIN " . TABLE_PRODUCTS_OPTIONS_VALUES . " pov on 
p2a.options_values_id = pov.products_options_values_id" . 
(defined('TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK') ? " JOIN " . 
TABLE_PRODUCTS_WITH_ATTRIBUTES_STOCK . " p2as on p.products_id = 
p2as.products_id " : "") : ''); 

$listing_sql .= " WHERE p.products_status = 1 
and p.products_quantity > 0 
and pd.language_id = '" . (int)$_SESSION['languages_id'] . "' 
and p2c.categories_id = '" . (int)$current_category_id . "'" . 
$filter . 
" group by pd.products_name " . 
$having . 
$alpha_sort; 

Группа по реализуется ближе к концу:

" group by pd.products_name " . 

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

p.products_price 

Я смотрел и пытался реализовать несколько примеров здесь: Select the 3 most recent records where the values of one column are distinct

Я просто не могу получить их право - мое понимание MySQL-запросов просто очень плохо. Любая помощь будет оценена по достоинству.

UPDATE:

SELECT DISTINCT p.products_id, p.products_type, p.master_categories_id, 
p.manufacturers_id, p.products_price, p.products_tax_class_id, 
pd.products_description, pd.products_name, IF(s.status = 1, 
s.specials_new_products_price, NULL) as specials_new_products_price,  
IF(s.status =1, s.specials_new_products_price, p.products_price) as 
final_price, p.products_sort_order, p.product_is_call, 
p.product_is_always_free_shipping, p.products_qty_box_status 

FROM zen_products p 
LEFT JOIN zen_specials s on p.products_id = 
s.products_id 
LEFT JOIN zen_products_description pd on p.products_id = pd.products_id 
JOIN zen_products_to_categories p2c on p.products_id = p2c.products_id 
WHERE p.products_status = 1 
and p.products_quantity > 0 
and pd.language_id = '1' 
and p2c.categories_id = '3' 

GROUP BY pd.products_name 
+2

Вы можете разместить SQL, генерируемый выше код? –

+0

вы можете попробовать что-то похожее на это: http://www.xpertdeveloper.com/2012/11/order-by-with-group-by-in-mysql/ – Avinash

+0

Да, код PHP здесь не очень полезен, потому что проблема связана с запросом, а не с PHP. Это вопрос MySQL. Проводка сгенерированного SQL и удаление PHP должны помочь – Machavity

ответ

0

Я не пробираться через все это, но общее решение заключается в следующем:

SELECT x.* -- DISTINCT would be redundant in this context. 
    FROM my_table x 
    JOIN 
    (SELECT grouping_column 
      , MIN(ordering_column) n 
     FROM my_table 
     GROUP 
      BY grouping_column 
    ) y 
    ON y.grouping_column = x.grouping_column 
    AND y.n = x.ordering_column; 
+0

Спасибо. Я застрял в реализации этого. Я не уверен, как принять что столбец группировки и столбец упорядочения находятся в двух отдельных таблицах. Итак, в вашем примере FROM my_table x (предположим, что это будет для TABLE_PRODUCTS, откуда исходит цена), но как насчет TABLE_PRODUCTS_DESCRIPTION, так как это где название продукта происходит от. – StuyvesantBlue

+0

Как вы узнаете, какое описание в таблице описаний относится к тому, какой продукт в таблице продуктов? – Strawberry

+0

Они связаны идентификатором продуктов. p.products_id и pd.products_id. См. обновленный мой исходный пост чтобы показать только SQL-запрос. – StuyvesantBlue

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