作者 主題: 如何從mysql的某些欄位中排序裡面的內容  (閱讀 14943 次)

0 會員 與 1 訪客 正在閱讀本文。

zxcvbn101

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
例如column1, column2, column3讓訪客可以填入最喜歡的三個城市
所以column1, column2, column3裡有倫敦、東京、台北...
等重複或不重複的資料,
請問如何從column1, column2, column3這三個欄位中得出排行版,例如:
台北(20筆)、東京(18筆)、倫敦(17筆)、台中(16筆).....等
謝謝

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #1 於: 2007-05-09 23:15 »
試試 COUNT() 配合 GROUP BY ...

zxcvbn101

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
列出前十筆
« 回覆 #2 於: 2007-05-10 00:02 »
列出前十名的城市,請問是這樣嗎?謝謝您

select city1, city2, city3, count(city1, city2, city3) from table group by city1, city2, city3 order by count(city1, city2, city3) desc limit 10

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #3 於: 2007-05-10 10:35 »
資料庫沒有正規化所以SQL很難搞...

table users
----------------
id user
1 abc
2 bcd
3 cde

table votes
--------------
id user_id cityname
1 1 Taipei
2 1 LA
3 1 NY
4 2 Toyko
5 2 LA
6 2 Taipei

SQL 取得城市排名
---------------
Select citys.cityname , count(citys.cityname) city_counter from citys group by citys.cityname
order by city_counter desc

SQL 取得投票名單
--------------
Select users.user, citys.cityname from users, citys
where users.id = citys.user_id
order by users.id

至於輸入的數量則是用程式去控制的.
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

asako

  • 活潑的大學生
  • ***
  • 文章數: 242
    • 檢視個人資料
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #4 於: 2007-05-10 11:02 »
試試看
select a.column1 ,count(a.column1)from (
select
column1
from table
union
select
column2
from table
union
select
column3
from table) a group by column1

zxcvbn101

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #5 於: 2007-05-12 00:40 »
不好意思,count(a.column1)的值全都是1耶,我列出十筆
a.column1(count(a.column1))的結果:
xxx1(1)
xxx2(1)
xxx3(1)
..........
好像都只count一筆資料而已
不知是不是我自己弄錯了
我試著只跑column1就好,column2和column3先不管
是可以得到我要的結果,只是空白欄也被統計出來,還排第一名,
不知要怎麼排除沒資料的欄位(就是user沒填入城市的地方),
不知mysql該怎麼排除空白的欄位,謝謝!

引述: "asako"
試試看
select a.column1 ,count(a.column1)from (
select
column1
from table
union
select
column2
from table
union
select
column3
from table) a group by column1

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #6 於: 2007-05-12 03:08 »
如果你堅持要用這樣的資料結構的話,

SQL 有點複雜, 不過還是有得解...


代碼: [選擇]
table
====================
id    c1   c2   c3
1     東京  倫敦  台北
2     倫敦  台北  台中
3     東京  台北  紐約
4     台中  東京  倫敦
5     倫敦  倫敦  東京


SQL:
代碼: [選擇]
select a.city, sum(a.cc) as sum from (
select c1 as city,count(*) as cc from test1 group by city
union all
select c2 as city,count(*) as cc from test1 group by city
union all
select c3 as city,count(*) as cc from test1 group by city
) a group by a.city order by sum desc limit 0,3


結果:
代碼: [選擇]
city  sum
倫敦   5
東京   4
台北   3

zxcvbn101

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #7 於: 2007-05-13 21:58 »
引述: "yamaka"
如果你堅持要用這樣的資料結構的話,

SQL 有點複雜, 不過還是有得解...


代碼: [選擇]
table
====================
id    c1   c2   c3
1     東京  倫敦  台北
2     倫敦  台北  台中
3     東京  台北  紐約
4     台中  東京  倫敦
5     倫敦  倫敦  東京


SQL:
代碼: [選擇]
select a.city, sum(a.cc) as sum from (
select c1 as city,count(*) as cc from test1 group by city
union all
select c2 as city,count(*) as cc from test1 group by city
union all
select c3 as city,count(*) as cc from test1 group by city
) a group by a.city order by sum desc limit 0,3


結果:
代碼: [選擇]
city  sum
倫敦   5
東京   4
台北   3


謝謝,成功了
再加上where c1 <> '' 也可以濾掉空白的地方!
再請問,"如果你堅持要用這樣的資料結構的話"
這句話是指這樣的作法不算是好的寫法嗎?
是否有比較通用或比較好的寫法呢?
謝謝您的指導

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #8 於: 2007-05-13 22:21 »
上面 Darkhero 大大不是說了嗎!!   :o  :o

用他建議的方式, SQL 命令會簡捷許多..

twinchang

  • 可愛的小學生
  • *
  • 文章數: 15
    • 檢視個人資料
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #9 於: 2007-05-27 12:55 »
你的問題剛好說明了為何資料表要做正規化(normalization)。

就是要做到像 Darkhero的例子那樣。

所以我很不明白的是為什麼有一大堆人都不去做資料正規化。
是懶、不懂做,還是要讓維護的人做死呢?
還是說他們都認為不做正規化,查詢資料的速度才會是最快?

zxcvbn101

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #10 於: 2007-05-28 00:34 »
問題是看不懂Darkhero那個例子的邏輯,也不懂什麼是資料表要做正規化(normalization),之前因為asako提供的解答,我比較看得懂,對我來說,這樣的邏輯我比較瞭解,所以從asako所提供的方法去思考如何解決問題。不是Darkhero解答的不好,而是我想得到的結果是像yamaka後來提供的解說,而不像asako解答的那樣,所以我看不懂,不曉得asako的意思為何,更不知,我這樣做是不願意不去做資料正規化!

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #11 於: 2007-05-28 08:28 »
引述: "zxcvbn101"
問題是看不懂Darkhero那個例子的邏輯,也不懂什麼是資料表要做正規化(normalization),之前因為asako提供的解答,我比較看得懂,對我來說,這樣的邏輯我比較瞭解,所以從asako所提供的方法去思考如何解決問題。不是Darkhero解答的不好,而是我想得到的結果是像yamaka後來提供的解說,而不像asako解答的那樣,所以我看不懂,不曉得asako的意思為何,更不知,我這樣做是不願意不去做資料正規化!



建議你找一本資料庫的書籍至少看一下,

將一些基本觀念稍微了解一點,

這樣你才能夠知道別人所言何物,

或者, 如果你只是為了應付作業的話,

那就當我沒說..



PS:
發言送出前, 請先確認過自己的發文內容沒問題,
或是沒有火星文(按預覽後多看幾遍), 避免引起一些不愉快~~

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #12 於: 2007-05-28 10:34 »
引述: "zxcvbn101"
問題是看不懂Darkhero那個例子的邏輯,也不懂什麼是資料表要做正規化(normalization),之前因為asako提供的解答,我比較看得懂,對我來說,這樣的邏輯我比較瞭解,所以從asako所提供的方法去思考如何解決問題。不是Darkhero解答的不好,而是我想得到的結果是像yamaka後來提供的解說,而不像asako解答的那樣,所以我看不懂,不曉得asako的意思為何,更不知,我這樣做是不願意不去做資料正規化!


So... 那買本書看看如何呢?...

或是您並不喜歡看書,只想上網,那要不要試試看用『資料庫正規化』作為關鍵字,在Google上面搜索看看呢?...

學習的管道有很多,自己找出關鍵字並且找到資料去學習吧!說什麼不是自己不願意正規話,我覺得你是根本沒有想到什麼是正規化,也沒有想過要了解什麼是正規化吧!
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

zxcvbn101

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #13 於: 2007-05-28 11:18 »
引述: "yamaka"

建議你找一本資料庫的書籍至少看一下,

將一些基本觀念稍微了解一點,

這樣你才能夠知道別人所言何物,

或者, 如果你只是為了應付作業的話,

那就當我沒說..

PS:
發言送出前, 請先確認過自己的發文內容沒問題,
或是沒有火星文(按預覽後多看幾遍), 避免引起一些不愉快~~


我不是念理工的,所以這個不是作業,我只是對寫網頁有興趣。
我去網路上找了相關的解釋:

正規化又稱normal form。它是在資料庫設計時的一個步驟,它是將一個資料庫利用關連性的觀念,切割成為數個較小型的資料庫,避免資料的重複性。例如原先我們有一個資料庫表格,包含下列欄位:『訂單編號、日期、貨號、貨品名稱、單價、數量、金額』。

在設計資料庫時,因為貨號和貨品名稱是相關的,所以在訂單主資料庫檔案當中,我們應該只設計其中一個欄位,另一個欄位再以另一個表格來表示,兩個表格再利用其中的相關欄位 (例如貨號) 連接起來。經過正規化的程序之後,會將上述表格分割成為下面兩個表格,其中訂單主檔包含下列欄位『訂單編號、日期、貨號、單價、數量、金額』,而貨品檔則包含『貨號、貨品名稱』兩個欄位,兩個表格之間以一個『貨號』欄位作為關連。

意思是不是,我要將下列這個資料表
代碼: [選擇]

table
====================
userid  column1 column2 column3 ...  c1   c2   c3
1                                                     東京  倫敦  台北
2                                                     倫敦  台北  台中
3                                                     東京  台北  紐約
4                                                     台中  東京  倫敦
5                                                     倫敦  倫敦  東京


拆成

代碼: [選擇]

table
====================
userid  column1 column2 column3 ...  
1                                                      
2                                                    
3                                                    
4                                                      
5                                                    


然後另開一個city table

代碼: [選擇]

table city
====================
sid  userid   city
1      1        東京
2        1           倫敦  
3      1        台北
4      2        倫敦  
5      3        台北  
.......

然後只要去處理city這個table就可以得到我要的東西
可是,
我目前想到的問題是
已經有很多資料在原table上了
不知該如何轉到新開的table city上?
還有,
我比較困難的是
原先訪客是在一個<form>...</form>之間
填入他們所有的基本資料,最後再填入三個他們喜歡的城市
如果要拆成兩個表格的話
我不知道該如何把這三個城市的欄位一一輸入table city裡
原本在<form>...</form>之間city的欄位是
<input type=text name=city1>
<input type=text name=city2>
<input type=text name=city3>
那我是不是要變成兩個form,第一個讓訪客輸入基本資料,第二個form再來讓訪客輸入喜歡的三個城市,然後把input改成
<input type=text name=city>
<input type=text name=city>
<input type=text name=city>
否則如何把三筆資料同時入mysql的同一個欄位?
不過,應該沒人這樣做吧,用兩個form蠻奇怪的,訪客應該也不喜歡這樣,所以,這個方法應該不對(我是指用兩個form)!

謝謝各位專家的撥冗解答與指教,比我看書還有用,書也買過很多,不過實在有看沒有懂。

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #14 於: 2007-05-28 11:29 »
從來沒有需要分成兩個 form 吧...
程式就是可以重複作一件事情,然後你只要給他不通的參數就好...

同一個 form 裡面有個人資料也有三個城市資料...

第一段程式處理 form 裡面個人資料部份,第二個處理城市的部份...
城市部份也不過就是從一個 insert 變成三個 insert ....

至於是要用 city1 , city2 ,city3 還是用 city[] 的陣列形式,就看你的程式要怎麼寫而已~
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #15 於: 2007-05-28 11:35 »
引述: "zxcvbn101"
我比較困難的是
原先訪客是在一個<form>...</form>之間
填入他們所有的基本資料,最後再填入三個他們喜歡的城市
如果要拆成兩個表格的話
我不知道該如何把這三個城市的欄位一一輸入table city裡
原本在<form>...</form>之間city的欄位是
<input type=text name=city1>
<input type=text name=city2>
<input type=text name=city3>
那我是不是要變成兩個form,第一個讓訪客輸入基本資料,第二個form再來讓訪客輸入喜歡的三個城市,然後把input改成
<input type=text name=city>
<input type=text name=city>
<input type=text name=city>
否則如何把三筆資料同時入mysql的同一個欄位?
不過,應該沒人這樣做吧,用兩個form蠻奇怪的,訪客應該也不喜歡這樣,所以,這個方法應該不對(我是指用兩個form)!


1. 為什麼要拆成兩個 form, 將資料一起傳到 server 之後,

就由後端的程式接手處理啊...

難道你都是直接將 form 資料丟進 db, 沒經過處理??



2. 三筆資料同時入mysql的同一個欄位??  

不是這樣吧, 你再看一下 Darkhero 大俠舉的例子!!

zxcvbn101

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #16 於: 2007-05-28 11:53 »
引述: "yamaka"

1. 為什麼要拆成兩個 form, 將資料一起傳到 server 之後,

就由後端的程式接手處理啊...

難道你都是直接將 form 資料丟進 db, 沒經過處理??


引述: "Darkhero"

從來沒有需要分成兩個 form 吧...
程式就是可以重複作一件事情,然後你只要給他不通的參數就好...

同一個 form 裡面有個人資料也有三個城市資料...

第一段程式處理 form 裡面個人資料部份,第二個處理城市的部份...
城市部份也不過就是從一個 insert 變成三個 insert ....

至於是要用 city1 , city2 ,city3 還是用 city[] 的陣列形式,就看你的程式要怎麼寫而已~


恩,這部分我懂怎麼做了,先取得資料後,後端程式再去處理資料要存入哪一個table。

原來是一筆一筆用insert的指令就好了,那我懂了,謝謝大家。

那把舊的table的資料寫到新的table city裡,我是不是把資料用while等迴圈一筆筆讀出來,然後在迴圈中,再一筆筆insert到table city裡就好,謝謝。

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #17 於: 2007-05-28 13:33 »
引述: "zxcvbn101"
恩,這部分我懂怎麼做了,先取得資料後,後端程式再去處理資料要存入哪一個table。

原來是一筆一筆用insert的指令就好了,那我懂了,謝謝大家。

那把舊的table的資料寫到新的table city裡,我是不是把資料用while等迴圈一筆筆讀出來,然後在迴圈中,再一筆筆insert到table city裡就好,謝謝。


把舊資料轉換成新的格式,本就是作苦工的事情...
寫一隻讓他自動一筆一筆的處理是正確的作法~
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

zxcvbn101

  • 懷疑的國中生
  • **
  • 文章數: 70
    • 檢視個人資料
如何從mysql的某些欄位中排序裡面的內容
« 回覆 #18 於: 2007-05-28 13:37 »
引述: "Darkhero"
把舊資料轉換成新的格式,本就是作苦工的事情...
寫一隻讓他自動一筆一筆的處理是正確的作法~


謝謝,我會處理了!