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優先度= 2、cat-2優先度= 1、cat-3優先度= 3、cat-4優先度= 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 に答える