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