Я знаю, что это было широко рассмотрено в 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
Вы можете разместить SQL, генерируемый выше код? –
вы можете попробовать что-то похожее на это: http://www.xpertdeveloper.com/2012/11/order-by-with-group-by-in-mysql/ – Avinash
Да, код PHP здесь не очень полезен, потому что проблема связана с запросом, а не с PHP. Это вопрос MySQL. Проводка сгенерированного SQL и удаление PHP должны помочь – Machavity