iT邦幫忙

1

SQL 加上GROUP_CONCAT 資料排序出問題

sql="select data1 From test where data2='123' AND data3 IN ('No','2001','2002','2003','2004','2005','2006','2007','2008','2009')"
原本以上這樣寫輸出的排序沒問題...

更改後加上 GROUP_CONCAT & GROUP BY
sql="select GROUP_CONCAT(data1) From test where data2='123' AND data3 IN ('No','2001','2002','2003','2004','2005','2006','2007','2008','2009')GROUP BY YY"
後第一筆資料排序就出錯了
變成 2009,2008,2007,2006,2004,2003,2002,2001,NO 這樣
其他筆資料也都跑錯位了
不知道是不是語法寫錯? 還是我不了解語法執行順序?

ckp6250 iT邦好手 1 級 ‧ 2020-10-04 18:36:46 檢舉
提示:
請詳細完整地看一下語法,
語法哦。
不好意思 因為是新手....不解...所以上來詢問看看...
2
rogeryao
iT邦大師 1 級 ‧ 2020-10-04 22:03:20
最佳解答
CREATE TABLE test 
(
id int,
name  nvarchar(10),
data nvarchar(10)
);

insert into test
values
(1,'lili','456'),
(2,'lili','123'),
(3,'lulu','789'),
(4,'jam','222'),
(5,'lili','777'),
(6,'jam','111');
-- group_concat : case 1
select name,group_concat(data order by data SEPARATOR ',' ) as combdata
from test
group by name
order by name
-- group_concat : case 2
select name,group_concat(data order by data SEPARATOR ',' ) as combdata
from test
group by name
order by name desc
-- group_concat : case 3
select name,group_concat(data order by data desc SEPARATOR ',' ) as combdata
from test
group by name
order by name 
-- group_concat : case 4
select name,group_concat(data order by data desc SEPARATOR ',' ) as combdata
from test
group by name
order by name desc
-- group_concat : case 5
select name,group_concat(data SEPARATOR ',' ) as combdata
from test
group by name

Demo 看看差異在哪,
就知要不要排序了

謝謝大大的範例!!讓我受益良多!!
但想再問如果我的data那欄如果是 > data-01 有 (-)符號
這樣該如何寫?
我給他分號資料會變成 data-01 data-01 並無法順利產出資料
EX

select name,group_concat('data-01' order by data SEPARATOR ',' ) as combdata
from test
group by name
order by name desc

非常感謝你!

rogeryao iT邦大師 1 級 ‧ 2020-10-05 16:23:09 檢舉
select name,group_concat(`data-01` order by `data-01` SEPARATOR ',' ) as combdata
from test
group by name
order by name desc

Demo

data-01 左右邊的 ` 用鍵盤左邊的 Tab 按鍵上方那個鍵
data-01 建議改成 data_01 以免之後下 SQL 時出現不可預期的錯誤,
還要再花時間除錯

感謝!!!成功了!!

1
小魚
iT邦大師 1 級 ‧ 2020-10-04 20:16:31

排序為什麼不用ORDER BY呢?

看更多先前的回應...收起先前的回應...

我並沒有要排序唷!只是要YY欄的data1 合併輸出資料

我並沒有要排序唷!只是要YY欄的data1 合併輸出資料

小魚 iT邦大師 1 級 ‧ 2020-10-05 07:33:26 檢舉

好像看懂你的需求了,
你可能要先排序再取資料.
試試看這樣.

sql="select GROUP_CONCAT(data1) FROM (
SELECT data1 From test where data2='123' AND data3 IN ('No','2001','2002','2003','2004','2005','2006','2007','2008','2009') ORDER BY XXX) AS a
GROUP BY YY"

非常謝謝你 目前我已經寫出來了!!

我錯在沒有把資料order by....以為sql會不變的直接輸出
感謝!!

1
一級屠豬士
iT邦大師 1 級 ‧ 2020-10-04 21:17:37

https://www.mysqltutorial.org/mysql-order-by/

When you use the SELECT statement to query data from a table, the result set is not sorted. It means that the rows in the result set can be in any order.

當你沒有下 order by 時, 查詢的結果會是 無序 的. 這是關聯式資料庫都這樣,不只MySQL.
所以我們通常會有一個 遞增 (或是遞減) 的欄位,或是有時間戳的欄位,以方便做 order by.

看更多先前的回應...收起先前的回應...

但我沒有要排序!我是需要讓YY欄的data1 資料合併輸出

像是YY data1
1 A,b,c
2 D,e,f

你沒有要排序我們都知道。
但你已經重新處理過資料了。其資料會自動依你建立的命令來重新處理。
所以出來的結果不會是如你預期的排序。

如果要你預期的排序。你就得重新排序。
不要將電腦程式當神看,它不懂你想要的東西。排不好就是要打他愛他。
懂了嘛??

group_concat() 也是要指定 order by , rogeryao大大 已經示範了一些範例.
你不把資料跟想達成的結果貼上來,大家又看不到你那邊的執行結果,
跟你心中想要的.幾乎新手都會這樣.我們幾個算好心的啦.不然無視就好了.

謝謝各位!!目前我已經成功寫出來了...
我錯在沒有把資料order by....以為sql會不變的直接輸出
感謝!!

我要發表回答

立即登入回答