2016-04-22 2 views
-1

В MySQL я не могу группировать три отдельных столбца данных через предложение GROUP BY.MySQL - предложение GROUP BY рекурсивно?

Этот образец содержит четыре марки, каждая марка имеет 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'); 
+0

Чувак, ты говоришь GROUPE BY ???? – Minh

+0

Результат, похоже, не является группой. Пожалуйста, добавьте больше деталей !!! – thisisbobbs

+2

Я не вижу связи между вашей таблицей и желаемым результатом. Можете ли вы объяснить критерии для определения результата? –

ответ

0

Вот что мне предложили, он не оптимизирован, но он работает.

Если у кого-то есть предложение, которое меня интересует.

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 | 
+----+---------+-------+----------+ 
0

Если вам нужен уникальный/определенный набор (марка, модель, версия) добавить все имя три столбца в 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 
+0

Получаю дубликаты результатов по 3 колонкам – marc1598

+0

Пробовали ли вы код? Я получаю повторяющиеся результаты на 3 колонки – marc1598

+0

Вот результат: '(Citroen, C4, электрический) (Ford, Focus, электрический) (Peugeot, 307, GPL) (Renault, Clio, Gazole) (Рено , Clio, GPL) (Renault, Modus, Electric) (Renault, Modus, Essence) ' – marc1598