我開始時類似的問題掙扎。我有一個不同的,但我相信更有效的答案。
這就是我到底有:
CALL `sandbox`.get_car_categories();
SELECT * FROM `sandbox`.cardemo;
SELECT * FROM `sandbox`.cardemo LIMIT 10;
+--------------+-------------------------+------+
| Car_category | Car_name | id |
+--------------+-------------------------+------+
| EURO | AUDI 5000 TOOTHY | 2754 |
| | PORSCHE DURAPHAT | 2756 |
| | PORSCHE PREVIDENT | 2758 |
| AMERICAN | TAURUS | 3 |
| | WRANGLER | 123 |
| | CHEROKEE | 2842 |
| | AMPHOCIL | 2834 |
| | AMPHOCIN | 2838 |
| | ARPHOTEC | 145 |
| | ARESTIN | 197 |
+--------------+-------------------------+------+
10 rows in set (0.19 sec)
這是一個新的學生一個超級重手的方法。但值得注意的是,如果你希望這實際上在行級別工作,如果使用像PHP等東西
基本上,與存儲過程,很容易處理循環和foreach類型的情況與內部和外部循環獲得你想要的效果,在特定的行級別,沒有GROUP_CONCAT
等解決方案。
你仍然維持原子行級/主鍵identifers但可以在主類別不僅僅是爲了美觀巢 - 如果你需要適應OP代碼的一行
的獨特cars.id
這是很重要...從MySQL手冊v5.6頁上的光標:Cursors Example
首先設置我們要寫入的表,以懶惰的方式。
#### I have a database called `sandbox`.
#### replace with yours
DROP TABLE IF EXISTS `sandbox`.cardemo;
CREATE TABLE `sandbox`.cardemo SELECT Car_category, Car_name, id from car;
TRUNCATE TABLE `sandbox`.cardemo;
現在我們進入了存儲過程和光標建立我們的名單表,並填寫我們在上面創建的表:
DROP PROCEDURE IF EXISTS `sandbox`.get_car_categories;
DELIMITER $$
CREATE PROCEDURE `sandbox`.get_car_categories()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE a, b, last_a VARCHAR(255) DEFAULT "";
DECLARE c INT DEFAULT 0;
DECLARE cur1 CURSOR FOR
SELECT Car_category, Car_name, id
from car ORDER BY 1,2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
read_loop: LOOP
FETCH cur1 INTO a, b, c;
IF done THEN
LEAVE read_loop;
END IF;
IF a != last_a THEN
INSERT INTO `sandbox`.cardemo VALUES (a, b,c);
SET last_a = a;
ELSE
INSERT INTO `sandbox`.cardemo VALUES ("", b,c);
END IF;
END LOOP;
CLOSE cur1;
END $$
DELIMITER ;
CALL `sandbox`.get_car_categories();
SELECT * FROM `sandbox`.cardemo LIMIT 10;
你爲什麼不只是做的是,在應用層面? –