Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对类别中的多个字段进行预排序_Php_Mysql_Sorting_Prestashop - Fatal编程技术网

Php 对类别中的多个字段进行预排序

Php 对类别中的多个字段进行预排序,php,mysql,sorting,prestashop,Php,Mysql,Sorting,Prestashop,我想按默认过滤器(如:位置、价格…)和数量对产品进行分类。数量为0的产品必须位于列表的末尾 Category.php()中的默认查询 我试图将数量添加到ORDER BY,但结果仅按位置排序 if ($random === true) { $sql .= ' ORDER BY RAND(), stock.`quantity` DESC LIMIT '.(int)$random_number_products; } else { $sql .= ' ORDER BY '.(!empt

我想按默认过滤器(如:位置、价格…)和数量对产品进行分类。数量为0的产品必须位于列表的末尾

Category.php()中的默认查询

我试图将数量添加到ORDER BY,但结果仅按位置排序

if ($random === true) {
    $sql .= ' ORDER BY RAND(), stock.`quantity` DESC LIMIT '.(int)$random_number_products;
} else {
    $sql .= ' ORDER BY '.(!empty($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.bqSQL($order_by).'` '.pSQL($order_way).', stock.`quantity` DESC
    LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
}
$sql = 'SELECT p.*, product_shop.*, real_quantity.*'.(Combination::isFeatureActive() ? ', IFNULL(product_attribute_shop.id_product_attribute, 0) AS id_product_attribute,
            product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '').', pl.`description`, pl.`description_short`, pl.`available_now`,
            pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, image_shop.`id_image` id_image,
            il.`legend` as legend, m.`name` AS manufacturer_name, cl.`name` AS category_default,
            DATEDIFF(product_shop.`date_add`, DATE_SUB("'.date('Y-m-d').' 00:00:00",
            INTERVAL '.(int)$nb_days_new_product.' DAY)) > 0 AS new, product_shop.price AS orderprice
        FROM `'._DB_PREFIX_.'category_product` cp
        LEFT JOIN `'._DB_PREFIX_.'product` p
            ON p.`id_product` = cp.`id_product`
        '.Shop::addSqlAssociation('product', 'p').
        (Combination::isFeatureActive() ? ' LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop
        ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')':'').'
        LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
            ON (product_shop.`id_category_default` = cl.`id_category`
            AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').')
        LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
            ON (p.`id_product` = pl.`id_product`
            AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').')
        LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop
            ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.')
        LEFT JOIN `'._DB_PREFIX_.'image_lang` il
            ON (image_shop.`id_image` = il.`id_image`
            AND il.`id_lang` = '.(int)$id_lang.')
        LEFT JOIN `'._DB_PREFIX_.'manufacturer` m
            ON m.`id_manufacturer` = p.`id_manufacturer`
        LEFT JOIN (SELECT * FROM `'._DB_PREFIX_.'stock_available` ORDER BY `quantity` DESC) AS real_quantity
            ON (real_quantity.id_product = p.id_product AND real_quantity.id_product_attribute = 0 AND real_quantity.id_shop = '.(int)$context->shop->id.')
        WHERE product_shop.`id_shop` = '.(int)$context->shop->id.'
            AND cp.`id_category` = '.(int)$this->id
            .($active ? ' AND product_shop.`active` = 1' : '')
            .($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '')
            .($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : '');

if ($random === true) {
    $sql .= ' ORDER BY RAND(), real_quantity.`quantity` DESC LIMIT '.(int)$random_number_products;
} else {
    $sql .= ' ORDER BY '.(!empty($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.bqSQL($order_by).'` '.pSQL($order_way).', real_quantity.`quantity` DESC
    LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
}
我试图通过添加Available_stock的子查询来更改此查询,但结果是相同的,仅按位置排序

if ($random === true) {
    $sql .= ' ORDER BY RAND(), stock.`quantity` DESC LIMIT '.(int)$random_number_products;
} else {
    $sql .= ' ORDER BY '.(!empty($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.bqSQL($order_by).'` '.pSQL($order_way).', stock.`quantity` DESC
    LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
}
$sql = 'SELECT p.*, product_shop.*, real_quantity.*'.(Combination::isFeatureActive() ? ', IFNULL(product_attribute_shop.id_product_attribute, 0) AS id_product_attribute,
            product_attribute_shop.minimal_quantity AS product_attribute_minimal_quantity' : '').', pl.`description`, pl.`description_short`, pl.`available_now`,
            pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, image_shop.`id_image` id_image,
            il.`legend` as legend, m.`name` AS manufacturer_name, cl.`name` AS category_default,
            DATEDIFF(product_shop.`date_add`, DATE_SUB("'.date('Y-m-d').' 00:00:00",
            INTERVAL '.(int)$nb_days_new_product.' DAY)) > 0 AS new, product_shop.price AS orderprice
        FROM `'._DB_PREFIX_.'category_product` cp
        LEFT JOIN `'._DB_PREFIX_.'product` p
            ON p.`id_product` = cp.`id_product`
        '.Shop::addSqlAssociation('product', 'p').
        (Combination::isFeatureActive() ? ' LEFT JOIN `'._DB_PREFIX_.'product_attribute_shop` product_attribute_shop
        ON (p.`id_product` = product_attribute_shop.`id_product` AND product_attribute_shop.`default_on` = 1 AND product_attribute_shop.id_shop='.(int)$context->shop->id.')':'').'
        LEFT JOIN `'._DB_PREFIX_.'category_lang` cl
            ON (product_shop.`id_category_default` = cl.`id_category`
            AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').')
        LEFT JOIN `'._DB_PREFIX_.'product_lang` pl
            ON (p.`id_product` = pl.`id_product`
            AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').')
        LEFT JOIN `'._DB_PREFIX_.'image_shop` image_shop
            ON (image_shop.`id_product` = p.`id_product` AND image_shop.cover=1 AND image_shop.id_shop='.(int)$context->shop->id.')
        LEFT JOIN `'._DB_PREFIX_.'image_lang` il
            ON (image_shop.`id_image` = il.`id_image`
            AND il.`id_lang` = '.(int)$id_lang.')
        LEFT JOIN `'._DB_PREFIX_.'manufacturer` m
            ON m.`id_manufacturer` = p.`id_manufacturer`
        LEFT JOIN (SELECT * FROM `'._DB_PREFIX_.'stock_available` ORDER BY `quantity` DESC) AS real_quantity
            ON (real_quantity.id_product = p.id_product AND real_quantity.id_product_attribute = 0 AND real_quantity.id_shop = '.(int)$context->shop->id.')
        WHERE product_shop.`id_shop` = '.(int)$context->shop->id.'
            AND cp.`id_category` = '.(int)$this->id
            .($active ? ' AND product_shop.`active` = 1' : '')
            .($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '')
            .($id_supplier ? ' AND p.id_supplier = '.(int)$id_supplier : '');

if ($random === true) {
    $sql .= ' ORDER BY RAND(), real_quantity.`quantity` DESC LIMIT '.(int)$random_number_products;
} else {
    $sql .= ' ORDER BY '.(!empty($order_by_prefix) ? $order_by_prefix.'.' : '').'`'.bqSQL($order_by).'` '.pSQL($order_way).', real_quantity.`quantity` DESC
    LIMIT '.(((int)$p - 1) * (int)$n).','.(int)$n;
}

有人能帮我解决这个问题吗?

SQL中的ORDER BY语句如下:

ORDER BY column1, column2 /*order results by column1, if 2 rows has the same column1 value then compare by column2*/
这意味着在MySQL语句中,第二列永远不会被考虑,因为第一列的值(位置)总是不同的

然后,如果您希望始终按数量订购,则应执行以下操作(假设
real\u quantity
已具有正确的quantity值):


如果数量为0的产品必须出现在列表的末尾,那么默认订单将不适用于您,正如我之前解释的那样。如果您希望保留默认订单,但在最后显示没有库存的产品,则应使用两条单独的SQL语句:1条用于库存>0的产品(使用
WHERE
条件)保留默认订单,另一条用于没有库存的产品。然后合并结果


祝你好运。

默认订单必须保留,数量为零的产品将显示在列表的末尾,并具有分页(限制)如果数量为0的产品必须显示在列表的末尾,则默认订单将不适用于您,正如我之前解释的那样。如果您希望保留默认订单,但在最后显示没有库存的产品,则应生成两条单独的SQL语句:1条用于库存>0的产品(使用WHERE条件)保留默认订单,另一条用于没有库存的产品。然后合并结果。我找到了一个更好的方法,例如
orderbystock.quantity>0desc,pl.name ASC
首先按数量排序,然后按名称排序