2011-11-30 48 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'的文件:) –