MySQL-GROUPBY子句递归?

MySQL-GROUPBY子句递归?,mysql,group-by,Mysql,Group By,在MySQL下,我不能通过GROUPBY子句对三个单独的数据列进行分组 此示例包含四个品牌,每个品牌有2个型号和4个版本的发动机。我需要提取4辆车的品牌,型号和发动机版本是不同的。在3列中有一个真正独特的结果 ----------+--------+----------+ Brand | Model | Version | ----------+--------+----------+ Renault | Clio | Essence | Citroen | C4

在MySQL下,我不能通过GROUPBY子句对三个单独的数据列进行分组

此示例包含四个品牌,每个品牌有2个型号和4个版本的发动机。我需要提取4辆车的品牌,型号和发动机版本是不同的。在3列中有一个真正独特的结果

----------+--------+----------+
Brand     | Model  | Version  |
----------+--------+----------+
Renault   | Clio   | Essence  |
Citroen   | C4     | GPL      |
Ford      | Fiesta | Gazole   |
Peugeot   | 206    | Electric |
----------+--------+----------+
这在8月10日起作用

SELECT brand, model, version 
    FROM cars WHERE version = (SELECT version FROM cars GROUP BY version ORDER BY RAND() LIMIT 1) 
GROUP BY brand
表的一个示例

CREATE TABLE IF NOT EXISTS `cars` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `brand` varchar(255) NOT NULL,
  `model` varchar(255) NOT NULL,
  `version` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci ROW_FORMAT=COMPRESSED;

INSERT INTO `cars` (`id`, `brand`, `model`, `version`) VALUES
    (1, 'Renault', 'Clio ', 'Essence'),
    (2, 'Renault', 'Clio ', 'Gazole'),
    (3, 'Renault', 'Clio ', 'GPL'),
    (4, 'Renault', 'Clio ', 'Electric'),
    (5, 'Renault', 'Modus', 'Essence'),
    (6, 'Renault', 'Modus', 'Gazole'),
    (7, 'Renault', 'Modus', 'GPL'),
    (8, 'Renault', 'Modus', 'Electric'),
    (9, 'Peugeot', '307', 'Essence'),
    (10, 'Peugeot', '307', 'Gazole'),
    (11, 'Peugeot', '307', 'GPL'),
    (12, 'Peugeot', '307', 'Electric'),
    (13, 'Peugeot', '206', 'Essence'),
    (14, 'Peugeot', '206', 'Gazole'),
    (15, 'Peugeot', '206', 'GPL'),
    (16, 'Peugeot', '206', 'Electric'),
    (17, 'Citroen', 'C4', 'Essence'),
    (18, 'Citroen', 'C4', 'Gazole'),
    (19, 'Citroen', 'C4', 'GPL'),
    (20, 'Citroen', 'C4', 'Electric'),
    (21, 'Citroen', 'C5', 'Essence'),
    (22, 'Citroen', 'C5', 'Gazole'),
    (23, 'Citroen', 'C5', 'GPL'),
    (24, 'Citroen', 'C5', 'Electric'),
    (25, 'Ford', 'Focus', 'Essence'),
    (26, 'Ford', 'Focus', 'Gazole'),
    (27, 'Ford', 'Focus', 'GPL'),
    (28, 'Ford', 'Focus', 'Electric'),
    (29, 'Ford', 'Fiesta', 'Essence'),
    (30, 'Ford', 'Fiesta', 'Gazole'),
    (31, 'Ford', 'Fiesta', 'GPL'),
    (32, 'Ford', 'Fiesta', 'Electric');

如果您需要唯一/独特的(品牌、型号、版本)集合,请在
GROUP BY
子句中添加所有三列名称,如下所示:

SELECT brand, model, version FROM cars 
WHERE version = (SELECT version FROM cars GROUP BY version ORDER BY RAND() LIMIT 1) 
GROUP BY brand, model, version

这里是我提供的,它不是优化的,但它的工作

如果有人提出我感兴趣的建议

CREATE TABLE IF NOT EXISTS temp AS
SELECT  
    tb1.id AS id1,
    tb1.brand   AS brand1,
    tb1.model   AS model1,
    tb1.version AS version1,
    tb2.id      AS id2,
    tb2.brand   AS brand2,
    tb2.model   AS model2,
    tb2.version AS version2,
    tb3.id      AS id3,
    tb3.brand   AS brand3,
    tb3.model   AS model3,
    tb3.version AS version3,
    tb4.id      AS id4,
    tb4.brand   AS brand4,
    tb4.model   AS model4,
    tb4.version AS version4
FROM `cars` AS tb1
    INNER JOIN `cars` AS tb2
        ON  tb2.brand   != tb1.brand
        AND tb2.model   != tb1.model
        AND tb2.version != tb1.version
        AND tb2.id      >  tb1.id
    INNER JOIN `cars` AS tb3
        ON  tb3.brand   != tb2.brand
        AND tb3.model   != tb2.model
        AND tb3.version != tb2.version
        AND tb3.id      >  tb2.id
        AND tb3.brand   != tb1.brand
        AND tb3.model   != tb1.model
        AND tb3.version != tb1.version
        AND tb3.id      >  tb1.id
    INNER JOIN `cars` AS tb4
        ON  tb4.brand   != tb3.brand
        AND tb4.model   != tb3.model
        AND tb4.version != tb3.version
        AND tb4.id      >  tb3.id
        AND tb4.brand   != tb2.brand
        AND tb4.model   != tb2.model
        AND tb4.version != tb2.version
        AND tb4.id      >  tb2.id
        AND tb4.brand   != tb1.brand
        AND tb4.model   != tb1.model
        AND tb4.version != tb1.version
        AND tb4.id      >  tb1.id
LIMIT 1

--------------
select * from sample
--------------

+-----+---------+--------+----------+-----+---------+--------+----------+-----+---------+--------+----------+-----+--------+--------+----------+
| id1 | brand1  | model1 | version1 | id2 | brand2  | model2 | version2 | id3 | brand3  | model3 | version3 | id4 | brand4 | model4 | version4 |
+-----+---------+--------+----------+-----+---------+--------+----------+-----+---------+--------+----------+-----+--------+--------+----------+
|   1 | Renault | Clio   | Essence  |  10 | Peugeot | 307    | Gazole   |  19 | Citroen | C4     | GPL      |  28 | Ford   | Focus  | Electric |
+-----+---------+--------+----------+-----+---------+--------+----------+-----+---------+--------+----------+-----+--------+--------+----------+
并获得结果格式化程序

SELECT  id1 AS id,
        brand1   AS brand,
        model1   AS model,
        version1 AS version
FROM temp

UNION

SELECT  id2      AS id,
        brand2   AS brand,
        model2   AS model,
        version2 AS version
FROM temp

UNION

SELECT  id3      AS id,
        brand3   AS brand,
        model3   AS model,
        version3 AS version
FROM temp

UNION

SELECT  id4      AS id,
        brand4   AS brand,
        model4   AS model,
        version4 AS version
FROM temp

+----+---------+-------+----------+
| id | brand   | model | version  |
+----+---------+-------+----------+
|  1 | Renault | Clio  | Essence  |
| 10 | Peugeot | 307   | Gazole   |
| 19 | Citroen | C4    | GPL      |
| 28 | Ford    | Focus | Electric |
+----+---------+-------+----------+

哥们,你说分组比???结果似乎不是分组比。请添加更多细节!!!我看不出你的表和期望的结果之间有什么联系。你能解释一下决定结果的标准吗?@DavidAman我也不明白OP在问什么。OP,您想要的结果是一个唯一的数据对,但并非所有列中可能的值都是唯一的。但为什么要包括福特、嘉年华、加佐尔和,比如说,福特、福克斯、加佐尔。这也是唯一的。我在3列上得到了重复的结果。你想试试你的代码吗?我在3列上得到了重复的结果。结果是:
(雪铁龙,C4,电动)(福特,福克斯,电动)(标致,307,GPL)(雷诺,克里奥,加佐尔)(雷诺,克里奥,GPL)(雷诺,摩杜斯,电动)(雷诺,摩杜斯,精华)
粘贴的结果,没有相同(品牌,型号,版本)的重复行,例如
A1,B2,C3
A1,B2,C1
是完全独一无二的。你的复制品在哪里?你说80%的时间都在工作?那么这不是一个正确的解决方案。