1

組み合わせではなく、順列のセットになる選択を実行したい。つまり、テーブル内のアイテムのさまざまな数量と配置を含む行を返すクエリを実行したいと考えています。ID を同じ行内で水平方向に繰り返すことはできません

たとえば、次のようにすることができます。

9 pick 3 
9 pick 5 
9 pick 7

有効なクエリがありますが、最適化を検討しています。このWHERE...AND...句は、重複する ID を持つ行を除外します。ANDこれは機能しますが、追加されたピック (列) ごとにいくつかの句を追加する必要があります。15 個のアサーションが必要です。9 pick 6!=選択するアイテムの数が増えると、これは扱いにくくなる可能性があります。また、非常に肥大しているように見えます。シンプルでエレガントなものを探しています。

ここに私のテーブルがあります:

CREATE TABLE IF NOT EXISTS `table1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `col1` varchar(24) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=30 ;

INSERT INTO `table1` (`id`, `col1`) VALUES
(1, 'Wool Hat'),
(2, 'Wool Gloves'),
(3, 'Fleece Sweater'),
(4, 'Jean Pants'),
(5, 'Cotton T-Shirt'),
(6, 'Wool Socks'),
(7, 'Wool Blanket'),
(8, 'Cotton Boxers'),
(9, 'Fleece Pants');

これが私のクエリです:

SELECT * FROM 
`table1` t1, 
`table1` t2, 
`table1` t3,
`table1` t4,
`table1` t5,
`table1` t6

WHERE
t1.id != t2.id
AND
t1.id != t3.id
AND
t1.id != t4.id
AND
t1.id != t5.id
AND
t1.id != t6.id
AND
t2.id != t3.id
AND
t2.id != t4.id
AND
t2.id != t5.id
AND
t2.id != t6.id
AND
t3.id != t4.id 
AND
t3.id != t5.id 
AND
t3.id != t6.id 
AND
t4.id != t5.id
AND
t4.id != t6.id
AND
t5.id != t6.id

ORDER BY t1.col1, t2.col1, t3.col1, t4.col1, t5.col1, t6.col1

洞察をありがとう!

編集:

例は本当に不謹慎です。私は単純かつ効率的な方法で順列の数学的概念を達成しようとしています。

リクエストにより、 の期待される結果の半分を以下に示し9 pick 2ます。残りの半分はペアを入れ替えたものです。

Wool Hat + Wool Gloves
Wool Hat + Fleece Sweater
Wool Hat + Jean Pants
Wool Hat + Cotton T-Shirt
Wool Hat + Wool Socks
Wool Hat + Wool Blanket
Wool Hat + Cotton Boxers
Wool Hat + Fleece Pants
Wool Gloves + Fleece Sweater
Wool Gloves + Jean Pants
Wool Gloves + Cotton T-Shirt
Wool Gloves + Wool Socks
Wool Gloves + Wool Blanket
Wool Gloves + Cotton Boxers
Wool Gloves + Fleece Pants
Fleece Sweater + Jean Pants
Fleece Sweater + Cotton T-Shirt
Fleece Sweater + Wool Socks
Fleece Sweater + Wool Blanket
Fleece Sweater + Cotton Boxers
Fleece Sweater + Fleece Pants
Jean Pants + Cotton T-Shirt
Jean Pants + Wool Socks
Jean Pants + Wool Blanket
Jean Pants + Cotton Boxers
Jean Pants + Fleece Pants
Cotton T-Shirt + Wool Socks
Cotton T-Shirt + Wool Blanket
Cotton T-Shirt + Cotton Boxers
Cotton T-Shirt + Fleece Pants
Wool Socks + Wool Blanket
Wool Socks + Cotton Boxers
Wool Socks + Fleece Pants
Wool Blanket + Cotton Boxers
Wool Blanket + Fleece Pants

これには、次のものは含まれません。

Wool Hat + Wool Hat
Wool Gloves + Wool Gloves
Fleece Sweater + Fleece Sweater
Jean Pants + Jean Pants
Cotton T-Shirt + Cotton T-Shirt
Wool Socks + Wool Socks
Wool Blanket + Wool Blanket
Cotton Boxers + Cotton Boxers
Fleece Pants + Fleece Pants
4

1 に答える 1

0

これはあなたが探しているものですか?

SELECT
    t1.`id` AS 'id1',
    t2.`id` AS 'id2',
    t1.`col1` AS 't1_col',
    t2.`col1` AS 't2_col',
    CONCAT(t1.`col1`,' + ',t2.`col1`) AS 'combined'
FROM `table1` t1
CROSS JOIN `table1` t2
WHERE t1.`id` != t2.`id`
-- or
-- WHERE t1.`id` < t2.`id`
ORDER BY t1.`id`,t2.`id`

[編集]別のオプションは、JOINS を使用することです。の例を次に示します9 pick 3

SELECT
    t1.`id` AS 'id1',
    t2.`id` AS 'id2',
    t3.`id` AS 'id3',
    t1.`col1` AS 't1_col',
    t2.`col1` AS 't2_col',
    t3.`col1` AS 't3_col',
    CONCAT_WS(' + ',t1.`col1`,t2.`col1`,t3.`col1`) AS 'combined'
FROM `table1` t1
INNER JOIN `table1` t2
INNER JOIN `table1` t3
ON
    t2.`id` > t1.`id` AND
    t3.`id` > t2.`id`
ORDER BY t1.`id`,t2.`id`,t3.`id`
于 2013-01-14T01:17:23.130 に答える