2015-11-23 105 views
2

10號在一個小時前被刪除的問題進行重新打印,打印數字1到100,每行

,如果我想打印出來的數字1-100,與10號到線 在mysql shell中,我該怎麼做呢?

回答

1

通常我所做的是創建一個表(通常是一個臨時表)並用存儲過程填充它。

CREATE TABLE `numTable` (
    `Id` int(11) NOT NULL auto_increment, 
    PRIMARY KEY (`Id`) 
)// 

CREATE PROCEDURE dowhile(IN tableLimit INT) 
BEGIN 
    DECLARE pointer INT DEFAULT tableLimit; 
    WHILE pointer > 0 DO 
    INSERT numTable VALUES (NULL); 
    SET pointer = pointer - 1; 
    END WHILE; 
END// 

CALL dowhile(100)// 

現在你可能需要使用DELIMITER但出於一致性的緣故,我剛纔複製的內容在SQL小提琴曾通過設置模式分隔符是//(向前按鈕波紋管架構窗口)

然後從那裏我然後通過給每行一個組ID來做這個表的選擇。因爲你想要10個我已經設置組爲10的倍數,然後通過使用GROUP_CONCAT這個組ID使這些行。

select myRow 
from ( 
    SELECT group_concat(id SEPARATOR ', ') as `myRow`, CEIL(id/10) as `groupId` 
    FROM numTable group by `groupID`) as myTable; 

SQL Fiddle

,因爲我們不希望顯示組ID,然後我讓這個子選擇,只有選擇我的新行。如果你在PHP或C#中使用它來輸出行,你可以做一個選擇,因爲你不必輸出從查詢結果中得到的所有東西。

+0

不錯的工作Memor-X – Drew

2

社區wiki答案,以免收集點數。隨意編輯。

select theAnswer 
from 
( select @rn:[email protected]+1 as rownum, 
    concat(1+(@rn-1)*10,' ',2+(@rn-1)*10,' ',3+(@rn-1)*10,' ',4+(@rn-1)*10,' ',5+(@rn-1)*10,' ', 
     6+(@rn-1)*10,' ',7+(@rn-1)*10,' ',8+(@rn-1)*10,' ',9+(@rn-1)*10,' ',10+(@rn-1)*10,' ') as theAnswer 
    from (select @rn:=0) params1 
    cross join (select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9 union select 10) params2 
) xDerived; 

+---------------------------------+ 
| theAnswer      | 
+---------------------------------+ 
| 1 2 3 4 5 6 7 8 9 10   | 
| 11 12 13 14 15 16 17 18 19 20 | 
| 21 22 23 24 25 26 27 28 29 30 | 
| 31 32 33 34 35 36 37 38 39 40 | 
| 41 42 43 44 45 46 47 48 49 50 | 
| 51 52 53 54 55 56 57 58 59 60 | 
| 61 62 63 64 65 66 67 68 69 70 | 
| 71 72 73 74 75 76 77 78 79 80 | 
| 81 82 83 84 85 86 87 88 89 90 | 
| 91 92 93 94 95 96 97 98 99 100 | 
+---------------------------------+ 

from ()的內部的東西是一個派生表,每個派生的表需要一個別名,也就是xDerived

@rn是一個行號變量。它在params1派生表中初始化。一排。

params2是另一個派生表,其中第1到第10行爲值。

cross join創建一個1x10的cartesian product(所有排列組合),結果爲10行,@rn隨每行增加。

由於我們只希望輸出一列,所以外層包裝只爲一列進行最終選擇,以避免輸出行號列。

如果想在mysql中使用WHILE DO循環,可以使用存儲過程。

1

MariaDBsequence plugin

select group_concat(seq order by seq separator ' ') 
from seq_1_to_100 
group by (seq-1) div 10; 

| group_concat(seq order by seq separator ' ') | 
|----------------------------------------------| 
| 1 2 3 4 5 6 7 8 9 10       | 
| 11 12 13 14 15 16 17 18 19 20    | 
| 21 22 23 24 25 26 27 28 29 30    | 
| 31 32 33 34 35 36 37 38 39 40    | 
| 41 42 43 44 45 46 47 48 49 50    | 
| 51 52 53 54 55 56 57 58 59 60    | 
| 61 62 63 64 65 66 67 68 69 70    | 
| 71 72 73 74 75 76 77 78 79 80    | 
| 81 82 83 84 85 86 87 88 89 90    | 
| 91 92 93 94 95 96 97 98 99 100    | 

一個通用的解決方案:

set @num_cols := 10; 
set @max := 100; 

select group_concat(seq order by seq separator ' ') 
from seq_1_to_1000000 
where seq <= @max 
group by (seq-1) div @num_cols 
order by min(seq); 

如果你想把它們都在一個單元格:

select group_concat(col separator '\n') 
from (
    select group_concat(seq order by seq separator '\t') as col 
    from seq_1_to_1000000 
    where seq <= @max 
    group by (seq-1) div @num_cols 
) drv 

想擁有列?

set @num_cols := 7; 
set @num_rows := 3; 

set @sql := (
    concat('select ', (
     select group_concat('(seq-1)*', @num_cols, '+', seq, ' as c', seq) 
     from seq_1_to_1000000 
     where seq <= @num_cols 
    ),' from seq_1_to_1000000 where seq<=', @num_rows) 
); 

prepare stmt from @sql; 
execute stmt; 

| c1 | c2 | c3 | c4 | c5 | c6 | c7 | 
|----|----|----|----|----|----|----| 
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 
| 8 | 9 | 10 | 11 | 12 | 13 | 14 | 
| 15 | 16 | 17 | 18 | 19 | 20 | 21 | 

如果您沒有序列插件的MariaDB,您可以創建一個帶有序列號的輔助表。問德魯如何做到這一點:-)

+0

永久助手錶,是的。特別是對於日期:p – Drew

+0

如果RDBMS不能幫助您,您需要幫助RDBMS :-) –