台灣最大程式設計社群網站
線上人數
948
 
會員總數:246135
討論主題:189716
歡迎您免費加入會員
討論區列表 >> PHP >> Group by 後又抓取某單筆資料
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
Group by 後又抓取某單筆資料
價值 : 30 QP  點閱數:2267 回應數:11
樓主

Randall
門外漢
0 3
109 15
發送站內信

最近一直摸索PHP受到高手們指教真是感激

小弟又有問題想要發問希望各位高手能不吝教導



因為selectsql內已經使用group by No 所以一直只抓到每個No的第一筆Inventory

請問有大大可以幫幫小弟解惑嗎

本篇文章發表於2013-12-12 16:41
1樓
作者回應

Randall
檢舉此回應
更正

查詢後結果的爐石戰記的Inventory為494
本篇文章回覆於2013-12-12 16:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

Solty
檢舉此回應
2種做法
1.子查詢,排序必須先在子查詢中處理(此法會造成temp table,當表的列數很大時,不用多,20萬筆就會變的很慢很慢,絕對不要應用在大型系統中)
2.分成多次查詢=>延伸速查表(基本這會考驗你程式設計的技巧,涉及快取設計,算是比較萬解的方式)
本篇文章回覆於2013-12-13 14:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

Randall
檢舉此回應
這樣說還是沒有解開小弟的疑問耶

小弟的selectsql內已經group by了

那可以在while($row = $DB_connect->fetchRow($Query_ID))然後在裡面用selectsql2讀取個別的嗎?
本篇文章回覆於2013-12-16 14:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
@@"

子查尋的用法不是你說的那樣。而且這是在php內的物件用法。你放在sql語法內根本就不會跑。

一般如果使用了group。就要盡量小心其條列資料的影響。
你可以先將group給拿掉。其它不變的情況下。看看列出來的資料排序情況。

一般為了怕條列資料錯誤。常會用的用法如下

select * from
(
select * from db where .....未group前的所有資料,這也是子查尋的一種
) as tt
group by xx

等條件資料確定正確後,再來做group處理。

不過就如Solty說的,使用子查尋在一些場合內。也有可能會加重負載。
所以再下條件就得要注意一下。另外group一定會全表處理。

一般我都會先用子查尋將並要的資料取出後再來做group。但某些應用上這樣子做會反而更死。

比較笨的方式,就是一次一個單項取出,存到變數後再用變數來做處理跟排序。
本篇文章回覆於2013-12-17 00:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

Randall
檢舉此回應
請問版主 as "tt"請問tt是?

小弟第一次接觸到這如果問了蠢問題還請多包涵 @@"

小弟現在指令大概為 selectsql=" select * from ( select * from Game where DATE_FORMAT(Time,'%Y') = '".$_GET["years"]."' AND DATE_FORMAT(Time,'%m') = '".$_GET["months"]."' order by Time desc ) as tt group by No order by Time desc "
本篇文章回覆於2013-12-17 14:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
看的出來Randall對SQL一些的進階用法不熟
當然如果想用一行SQL去搞定問題,很好很有志氣,不過你可能得把GROUP BY和子查詢的基礎弄懂
例如你目前的SQL式就是一個解釋不通的式子
這邊你可能得花上相當的時間和精力並且要有多次撞壁失敗的覺悟(寫程式就是這樣)

如果你是工作上需要,有著時間上的壓力
建議你用笨方法來做
Solty大的第2種方法的基礎版
先查詢所有共通值的部分No、Name、Price

接著用結果去排Table
等排到Sold和Inventory這些要運算的部分時
再查出時段內該遊戲的值來做運算
這邊可以將運算放在SQL進行例如SUM之類的函數
也可以用PHP去計算
後者雖然效率較差但畢竟比較簡單
工作時先求結果出來再追求效能
本篇文章回覆於2013-12-17 17:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

Randall
檢舉此回應
恩 小弟現在按部就班慢慢來

先GROUP BY No 查詢出No,Name,Price了

小弟要總和Sold 所以可以能一同顯示嗎?

selectsql = "SELECT No,Name,Price,sum(Sold) FROM Game GROUP BY No,Name,Price ORDER BY No";

這樣,還是說先不要,那之後應該要如何下一步呢? 在selectsql裡沒有查詢出Sold與Inventory該在哪開始查呢?
本篇文章回覆於2013-12-17 18:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
最有價值解答

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
大約給你說明一下好了。

一般用group
主要還是用在統計。

也就是說你光用*的情況下。在非用統計相關的函數下。其它的值就不一定會是你要的值。
除非你確定其它的值全都是統一一樣的。

再來就是使用group的時候,如果使用混用多表的情況下。
也就是有機會去產生同筆資料不同的筆數出來。
這會依照你的where的條件下,可能有機會產生不一樣的值。
不過你的sql命令並未混用多表,所以這樣的情況就可以說不會發生

所以一般我都會建議再使用group之前。先不要使用group的情況下。查看出來的資料是否有正確。
除非你很確定你很了解。

原則上給你正確答案並非我的本意。不過看你是真的很誠心要問。
我來幫你改成你要的sql命令



其中這段DATE_FORMAT(Time,'%Y-%m-%d') AS s_time這段可有可無。因為我不確定你的time欄位是否只有記錄日期無記錄時間。有記錄時間的話,就有可能會發生不一樣的資料出來。
所以我額外加上這一個來做統合一下。這是為了將資料統一處理好做多重的統計。
而在第10行的GROUP BY No,s_time。就是依照兩個條件來做區分統計。
如果你確定你的time欄位只會儲存年月日的話。就可以不需要使用s_time這樣的條件。直接使用time就是了。
再來我不確定你的排序情況為何。所以我是用No,s_time的方式做處理。不過看了一下你的需求。因該是要用s_time,No的順序才對。
你可以兩個都試看看。

在子查尋堙A已經將資料都依日期排序了。所以其它的欄位對應就會依照最新的日期資料為主。
這是我大約看你的需求來寫出來的sql命令。
不過我並沒有實際操作過。你可以研究試看看。不一定會對。畢竟並不完全了解你的資料情況。
本篇文章回覆於2013-12-17 21:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

hfovg
檢舉此回應
基本上 浩瀚星空版主 已經把答案雙手奉上,
但是初學者必定很多東西不懂,
建議你除了領用浩瀚大提供的程式以外,
自己多嘗試,然後去了解不清楚的地方:

1.group by怎麼使用
2.什麼是子查詢
3.子查詢怎麼用
4.前面有提到的AS tt 是什麼意思?"AS"怎麼用?
本篇文章回覆於2013-12-17 22:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
說真的
前三點問題除了需要一篇好的、完整的教學外
還需要經驗的累積,才能真的理解和掌握
但是第四點就真的是只要Google一下就能找到答案
本篇文章回覆於2013-12-18 09:49
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

Randall
檢舉此回應
感謝各位的指教,小弟因為有時間的壓力所以並沒有完整的去學習

最近發問的問題也比較多,也Google了不少

小弟在完成進度後會重新完整的學習好,謝謝各位教導
本篇文章回覆於2013-12-18 10:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.