2014-07-10 40 views
2

我有一個複雜的查詢來顯示它。 (我只會給的例子)從組和成員獲取表中的數據

表租車

ID  Car_name  Car_category 
1  Ferrari  sporty 
2  Nissan  SUV 
3  Audy   Sporty 
4  Honda  City car 
5  Mitsubishi SUV 

我想我的查詢顯示該結果:

Car_category  Car_name 

Sporty   Ferrari 
       Audy 
SUV    Nissan 
       Mitsubishi 
City Car   Honda 

我嘗試此查詢,但錯了..

SELECT a.Car_category, 
(
    SELECT b.Car_name 
    FROM car b 
    WHERE b.Car_category = a.Car_category 
    ORDER BY Car_name 
    LIMIT 1,1 
) as Car_name 
FROM car a 
GROUP BY a.class 

它是任何解決方案的傢伙?真的需要你的幫助,感謝您的關注..

+0

你爲什麼不只是做的是,在應用層面? –

回答

0

嘗試用GROUP_CONCAT

SELECT car_category, 
     group_concat(car_name separator '\n') 
FROM `Car` 
GROUP BY car_category 

檢查SQL Fiddle

+0

不錯,聰明。謝謝,q應該是你的學生.. –

+0

歡迎@ ws_123 – Sadikhasan

0

我開始時類似的問題掙扎。我有一個不同的,但我相信更有效的答案。

這就是我到底有:

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;