iT邦幫忙

0

[MySQL]如何將group_concat的結果再放到包含in的子查詢中查詢? 或替代方法?

如何將group_concat的結果再進行包含in的子查詢? 或替代方法?

補上實際例子
http://sqlfiddle.com/#!9/86d0f4/12/0

直接來個示意的例子比較快~~~
select group_concat(XXX.field1),
(
select sum(ZZZ) from OOO where field2 in (group_concat(XXX.field1))
) field2
from XXX
group XXX

目前已知因為group_concat出來的結果是一個完整的字串,放到in中要馬出錯要馬啥都找不到~

第一個想到的是做split,把字串轉成陣列~

不過網路上的split幾乎是切割後放到臨時表中,然後再要使用的地方使用select這個臨時表,這樣塞不進我的select中,想請問各位前輩們是如何解決或繞過這個問題的??

(雖然可以丟到後端語言進行二次處裡,不過如果要進行篩選查詢,就必須先整份完整數據都抓出來並運算完後才能篩選出要的結果回傳,資料量大的話怕記憶體會不夠@@,所以希望全在sql內處理掉,因為把結果的外面再包一層select用where篩掉就好)

看更多先前的討論...收起先前的討論...
你應該是要用 charindex or inStr來做字串處理吧?? 不是用 IN..
舜~ iT邦研究生 2 級 ‧ 2019-08-28 13:19:24 檢舉
也是XDD 還有FIND_IN_SET~~
如果field1是索引,有什麼方法可以不要變成字串而失去索引的速度?
小魚 iT邦大師 1 級 ‧ 2019-08-28 13:55:01 檢舉
我覺得你的問法不對,
你應該先說你的需求,
再說目前的作法...
基本上看幾秒看不懂的問題我就會直接跳過,
除非那時候剛好比較閒.
舜~ iT邦研究生 2 級 ‧ 2019-08-28 14:31:14 檢舉
補上實際的例子,這樣應該比較好懂
http://sqlfiddle.com/#!9/86d0f4/12/0
1
ckp6250
iT邦新手 4 級 ‧ 2019-08-28 16:52:34
最佳解答

坦白說,看不太懂題目,
而且,如同一級屠豬士所語,例子實在太差,就算想幫您寫,
也不知正確答案是什麼?無從驗證,
下回發問,最好把例子弄多筆,越多越好,越亂越佳,
並把您想要的案答,寫出來。

我是用猜的啦,您看看行否?

SELECT
	a.*,
	( SELECT sum( class.class_studentNbr ) FROM class WHERE class.class_schId = a.plan_schId AND class.class_depId = a.plan_depId ) AS `學生人數` 
FROM
	(
	SELECT
		plan.plan_schId,
		plan.plan_depId,
		plan.plan_semester,
		GROUP_CONCAT( plan.plan_id ) AS plan_id,
		GROUP_CONCAT( DISTINCT plan.plan_year ) AS plan_year,
		GROUP_CONCAT( DISTINCT plan.plan_name ) AS `計畫名稱`,
		GROUP_CONCAT( DISTINCT plan.class_id ) AS `班級(不重複)`,
		SUM( plan.plan_fund ) AS `經費` 
	FROM
		plan 
	GROUP BY
		plan.plan_schId,
		plan.plan_depId,
	plan.plan_semester 
	) a;
0
純真的人
iT邦高手 1 級 ‧ 2019-08-28 12:33:39

不對吧..

group_concat是想要查詢的結果列印出來~

但若放在sql裡面的條件in查詢就不需要吧~

select *
from xxx
where x in(select xxx from xxx)

看更多先前的回應...收起先前的回應...
舜~ iT邦研究生 2 級 ‧ 2019-08-28 13:23:17 檢舉

因為select..group出來的多個欄位中,其中一個欄位想做為另一個子查詢的條件來撈取資料不知道要怎麼處裡...

舜~ iT邦研究生 2 級 ‧ 2019-08-28 13:25:20 檢舉

而透過group_concat抓出集合值變成字串就會失去該欄位索引的特性又很可惜,不曉得有沒有抓出集合成為陣列的方法...

一般來說如果資料來源是另外丟過來的~
條件都會這樣下~

where charindex(',' + id + ',',',1,2,3,4,') > 0

只是就應該比較慢吧..

但還是要看你的真正寫法才確定~你的問題是怎樣@@

舜~ iT邦研究生 2 級 ‧ 2019-08-28 14:32:08 檢舉

補個實際的例子
http://sqlfiddle.com/#!9/86d0f4/12/0

1
一級屠豬士
iT邦新手 2 級 ‧ 2019-08-28 16:26:36

你其實是同樣的問題,一路下來問了三次,現在已經歪掉了.用到 group_concat,又要再拆分,這已經是做虛功了.
你有沒有發覺,你問的時候,舉的例子很差,兩個都是30,而且也不直接清楚的描述,變成真的的目標與過程中你嘗試的方法混雜在一起.
你再自己好好理一下,把Table,測試資料,與目標再好好描述.不然是很難幫你的.

舜~ iT邦研究生 2 級 ‧ 2019-08-29 10:58:53 檢舉

恩...確實如此,感恩提醒

1
tomatoeggs
iT邦新手 5 級 ‧ 2019-09-01 20:59:17

select plan_schId,plan_depId,plan_semester
,group_concat(distinct plan_name) '計畫名稱'
,group_concat(distinct concat(class_grade,class_room)) '班級(不重複)'
,group_concat(distinct c1.class_id) '班級id(不重複)'
,sum(plan_fund) '經費'
,60 '正確不重複學生數'
,(
select sum(class_studentNbr) from class
where find_in_set(class_id,group_concat(distinct c1.class_id))
) '學生人數(不重複)'

from plan
inner join class c1 on plan.class_id = c1.class_id
group by plan_schId,plan_depId,plan_semester

我要發表回答

立即登入回答