0

我有一个包含不同类别的数据库表,其中包含不同的产品,每个类别都有一些优先级。假设 cat-1 有 5 个产品,cat-2 包含 3 个产品,cat-3 包含 3 个产品,cat-4 包含 2 个产品。

在展示产品时,顺序应如下所示。

如果类别具有相同的优先级(假设 cat-1、cat-2 优先级 = 1、cat-3 优先级 = 2、cat-4 优先级 = NULL),则产品将显示如下。

c1p1,c2p1,c1p2,c2p2,c1p3,c2p3,c1p4,c1p5,c3p1,c3p2,c3p3,c4p1,c4p2。

如果类别具有相同的优先级(假设 cat-1、cat-2 优先级 = 1、cat-3 和 cat-4 优先级 = 2),则产品将显示如下。

c1p1,c2p1,c1p2,c2p2,c1p3,c2p3,c1p4,c1p5,c3p1,c4p1,c3p2,c4p2,c3p3。

如果类别具有不同的优先级(假设 cat-1 priority = 2、cat-2 priority = 1、cat-3 priority = 3 和 cat-4 priority = Null),则产品将显示如下。

c2p1,c2p2,c2p3,c1p1,c1p2,c1p3,c1p4,c1p5,c3p1,c3p2,c3p3,c4p1,c4p2。

这里 c = 类别和 p = 产品。

在Mysql中可以进行这种类型的排序吗?请帮忙。

这是数据库表的结构和示例数据-

   CREATE TABLE IF NOT EXISTS `categories` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `name` varchar(255) NOT NULL,
    `priority` int(11) DEFAULT NULL,
     PRIMARY KEY (`id`)
   ) ;

   INSERT INTO `categories` (`id`, `name`, `priority`) VALUES
   (1, 'c1', 1),
   (2, 'c2', 1),
   (3, 'c3', 2),
   (4, 'c4', NULL);

   CREATE TABLE IF NOT EXISTS `products` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `category_id` int(11) NOT NULL,
    `name` varchar(255) NOT NULL,
    PRIMARY KEY (`id`)
   ) ;

INSERT INTO `products` (`id`, `category_id`, `name`) VALUES
(1, 1, 'c1p1'),
(2, 1, 'c1p2'),
(3, 1, 'c1p3'),
(4, 1, 'c1p4'),
(5, 1, 'c1p5'),
(6, 2, 'c2p1'),
(7, 2, 'c2p2'),
(8, 2, 'c2p3'),
(9, 3, 'c3p1'),
(10, 3, 'c3p2'),
(11, 3, 'c3p3'),
(12, 4, 'c4p1'),
(13, 4, 'c4p2');
4

3 回答 3

2

您可以创建一个具有优先级的表:

create table priorities (
  category varchar(255),
  priority int null);

然后您可以通过这种方式选择产品:

select
  products.*
from
  products inner join priorities
  on products.category = priorities.category
order by
  priorities.priority is null, -- this to put null values at the end
  priorities.priority,
  products.id                  -- or some other field

编辑:这可能是您正在寻找的:

select
  products.name
from
  products inner join categories
  on products.category_id = categories.id
order by
  categories.priority is null,
  categories.priority,
  substr(products.name,3),
  categories.name
于 2012-12-17T08:17:12.723 回答
0

最后我得到了一个更好的解决方案。我在产品表中添加了一个额外的字段。动机是给每个类别的产品一个序列号。我的最终产品表结构如下所示。

CREATE TABLE IF NOT EXISTS `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`category_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`sl_no` int(11) NOT NULL,
 PRIMARY KEY (`id`)
);

INSERT INTO `products` (`id`, `category_id`, `name`, `sl_no`) VALUES
(1, 1, 'c1p1', 1),
(2, 1, 'c1p2', 2),
(3, 1, 'c1p3', 3),
(4, 1, 'c1p4', 4),
(5, 1, 'c1p5', 5),
(6, 2, 'c2p1', 1),
(7, 2, 'c2p2', 2),
(8, 2, 'c2p3', 3),
(9, 3, 'c3p1', 1),
(10, 3, 'c3p2', 2),
(11, 3, 'c3p3', 3),
(12, 4, 'c4p1', 1),
(13, 4, 'c4p2', 2);

查询看起来像 -

SELECT  `Category`.`id` ,  `Category`.`name` ,  `Category`.`priority` ,    `Product`.`name` ,  `Product`.`category_id` 
FROM  `categories` AS  `Category` 
INNER JOIN  `products` AS  `Product` 
WHERE  `Category`.`id` =  `Product`.`category_id` 
ORDER BY CASE WHEN  `Category`.`priority` IS NULL 
THEN 1 
ELSE 0 
END ASC ,  `Category`.`priority` ASC ,  `Product`.`sl_no` ,  `Product`.`category_id`;
于 2013-01-18T07:14:32.103 回答
-1

这是根据要求获取序列的间接解决方案。

当我使用 PHP 获取数据时,首先我编写了一个 sql 查询来根据优先级获取数据。

SELECT `Category`.`id`, `Category`.`name`, `Category`.`priority` , `Product`.`name`, `Product`.`category_id` FROM `categories` AS `Category` INNER JOIN `products` AS `Product` WHERE `Category`.`id` = `Product`.`category_id` ORDER BY CASE WHEN `Category`.`priority` IS NULL THEN 1 ELSE 0 END ASC, `Category`.`priority` ASC;

然后我做了一个简单的数组操作来得到一个数组,如下所示。

array(
(int) 1 => array(
    (int) 0 => array(
        (int) 0 => '1',
        (int) 1 => '6'
    ),
    (int) 1 => array(
        (int) 0 => '2',
        (int) 1 => '7'
    ),
    (int) 2 => array(
        (int) 0 => '3',
        (int) 1 => '8'
    ),
    (int) 3 => array(
        (int) 0 => '4'
    ),
    (int) 4 => array(
        (int) 0 => '5'
    ),
),  
(int) 2 => array(
    (int) 0 => array(
        (int) 0 => '9'
    ),
    (int) 1 => array(
        (int) 0 => '10'
    ),
    (int) 2 => array(
        (int) 0 => '11'
    ),      
),
'' => array(
    (int) 0 => array(
        (int) 0 => '12'         
    ),
    (int) 1 => array(
        (int) 0 => '13'

    )
)
)

对于系列 c1p1、c2p1、c1p2、c2p2、c1p3、c2p3、c1p4、c1p5、c3p1、c3p2、c3p3、c4p1、c4p2。其中数组键是优先级,叶值是产品 ID。

然后我从上面的数组中创建一个 id 字符串,如下所示。

  1,6,2,7,3,8,4,5,9,10,11,12,13

最后将查询编写如下。

 SELECT * 
 FROM  `products` 
 WHERE  `id` 
 IN ( 1, 6, 2, 7, 3, 8, 4, 5, 9, 10, 11, 12, 13 ) 
 ORDER BY FIELD( id, 1, 6, 2, 7, 3, 8, 4, 5, 9, 10, 11, 12, 13 );
于 2012-12-27T12:25:13.080 回答