2011-11-30 47 views
2

這裏是我的表數據SQL查詢來計算 「存儲數據的方式不同」

門票

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ id | tic_files              | 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 1 | 56456sasd.jpg,asd4455asd.jpg,asd564asd5.txt,asd564asd.css  | 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 2 | 56a4sdasd.txt,jkasd5ass.jpg         | 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 3 |                | 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 4 | asdjhagsd.gif,spsnd65asd.php,56a4sd54asd.txt     | 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

評論

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ id | tic_id | com_files              | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 1 | 1  | 56456sasd.jpg,asd4455asd.jpg,asd564asd5.txt     | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 2 | 3  | 56a4sdasd.txt,jkasd5ass.jpg         | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 3 | 1  | sdf54sdf.gif,swrsdf54sdf.rar         | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 4 | 2  | asdjhagsd.gif,spsnd65asd.php,56a4sd54asd.txt     | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

這裏是我的問題和我的重

I希望結果是這樣

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ tic_id | count(tic_files)  | count(com_files)  | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 1  |   4    |  5     | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 2  |   2    |  3     | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 3  |   0    |  2     | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 4  |   3    |  0     | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

我試圖做這

加入門票與GROUP_CONCAT(評論)和獲取數據這樣

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
| tic_id | tic_files             | com_files                | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
| 1  | 56456sasd.jpg,asd4455asd.jpg,asd564asd5.txt,asd564asd.css | 56456sasd.jpg,asd4455asd.jpg,asd564asd5.txt,sdf54sdf.gif,swrsdf54sdf.rar | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
| 2  | 56a4sdasd.txt,jkasd5ass.jpg        | asdjhagsd.gif,spsnd65asd.php,56a4sd54asd.txt        | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
| 3  |               | 56a4sdasd.txt,jkasd5ass.jpg            | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
| 4  | asdjhagsd.gif,spsnd65asd.php,56a4sd54asd.txt    |                   | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

一些東西,但我會盡力使用多於group_concat(在所有服務器上的限制爲1024 kb),所以我想要計算使用文件之間的分隔符「,」

解決

這是我的查詢

SELECT 
        cat_id as cat__id , 
        cat_name,(
        SELECT count(tickets.tic_id) from tickets INNER JOIN cats on(tickets.tic_cat = cats.cat_id) where tickets.tic_cat = cat__id group by tickets.tic_cat limit 1 
       ) as "count(tickets)",(
        SELECT (LENGTH(GROUP_CONCAT(tickets.tic_files)) - LENGTH(REPLACE(GROUP_CONCAT(tickets.tic_files) , "," , "")) + 1) FROM tickets 
        INNER join cats on (tickets.tic_cat = cats.cat_id) 
        WHERE tickets.tic_files != "" AND tickets.tic_cat = cat__id 
         LIMIT 1 
        ) as "count(ticket_files)",(
        SELECT GROUP_CONCAT(tickets.tic_files) FROM tickets 
        inner join cats on (tickets.tic_cat = cats.cat_id) 
        WHERE tickets.tic_files != "" AND tickets.tic_cat = cat__id 
         LIMIT 1 
        ) as "tickets_files", 
        COUNT(comments.tic_id),(
        SELECT (LENGTH(GROUP_CONCAT(comments.com_files)) - LENGTH(REPLACE(GROUP_CONCAT(comments.com_files) , "," , "")) + 1) FROM comments 
        INNER join tickets on (tickets.tic_id = comments.tic_id) 
        INNER join cats on (tickets.tic_cat = cats.cat_id) 
        WHERE comments.com_files != "" AND comments.tic_id = tickets.tic_id and tickets.tic_cat = cat__id 
         LIMIT 1 
        ) as "count(com_files)",(
        SELECT GROUP_CONCAT(comments.com_files) FROM comments 
        INNER join tickets on (tickets.tic_id = comments.tic_id) 
        inner join cats on (tickets.tic_cat = cats.cat_id) 
        WHERE comments.com_files != "" AND comments.tic_id = tickets.tic_id and tickets.tic_cat = cat__id 
         LIMIT 1 
        ) as "com_files" 
      from tickets 
      INNER JOIN cats ON (tickets.tic_cat = cats.cat_id) 
      INNER JOIN comments ON (comments.tic_id = tickets.tic_id) 
    group by tickets.tic_cat 

,這裏是結果的畫面

Result Of My query

+1

我認爲你的結果表有點不對,對於tic_id爲3的計數(com_files)應爲2,對於tic_id爲4的計數爲(com_files)爲0 –

+0

這種設計有點瘋狂。修理它太晚了嗎? –

+0

@安德魯傑克曼,我編輯問題,謝謝 –

回答

4

有可能算在這樣的字符串出現次數的數量:

SELECT LENGTH(GROUP_CONCAT(DISTINCT tic_files SEPARATOR ",")) - LENGTH(REPLACE(GROUP_CONCAT(DISTINCT tic_files SEPARATOR ",") , ',' , '')) + 1 AS `TIC File Count` 

這樣做的方法是先取出列的總長度,然後在用空格替換要搜索的所有字符後減去列的長度。

所以56a4sdasd.txt,jkasd5ass.jpg將變爲56a4sdasd.txtjkasd5ass.jpg,返回的值將是1.您只需要添加1,並且您將有圍繞分隔符的字符串總數。

+0

是你的想法是非常好的*我想你的意思是,如果我的文件長度是10我將刪除','結果將是(全長/ 10)*正確,但是我的文件長度不一樣:( –

+0

沒有分割進行,這將查看文件名字符串的長度。 '56a4sdasd.txt,jkasd5ass.jpg'爲28.然後它刪除所有的','並找到一個新的長度,'56a4sdasd.txtjkasd5ass.jpg'的長度是27.然後它減去28-27,它是1。然後它加1,變爲2.而2是字符串中文件名的數量 –

+0

我只是想知道你是否可以有一個名爲'One,two,three.jpg'的文件:) –