【问题标题】:Sql Query To count "different way of stored data"Sql Query 统计“存储数据的不同方式”
【发布时间】:2012-01-09 14:36:57
【问题描述】:

这是我的表格数据

门票

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 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                  |
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

这是我的问题和我的重试

我希望结果是这样的

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

我试过这样做

使用 group_concat( cmets ) 加入票证并获取类似这样的数据

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
| 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

这是结果图片

【问题讨论】:

  • 我认为你的结果表有点错误,如果 tic_id 为 3,count(com_files) 应该是 2,如果 tic_id 为 4,count(com_files) 应该是 0
  • 这个设计有点疯狂。修复它是否为时已晚?
  • @Andrew Jackman,我编辑问题,谢谢
  • @Álvaro G. Vicario 是的,这是个坏主意,但帮助了我很多次:)

标签: mysql count group-concat


【解决方案1】:

可以像这样计算字符串中出现的次数:

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 即可得到分隔符周围的字符串总数。

【讨论】:

  • 是的,您的想法非常好我想您的意思是,如果我的文件长度为 10,我将删除 ,,结果将是(全长 / 10) 对,但我的文件长度不一样:(
  • 没有进行除法。这将查看文件名字符串的长度。 56a4sdasd.txt,jkasd5ass.jpg 的长度是 28。然后它删除所有的 ',' 并找到一个新的长度。 56a4sdasd.txtjkasd5ass.jpg 的长度为 27。然后它减去 28 - 27 即为 1。然后它加 1,即为 2。而 2 是字符串中文件名的计数。
  • 我只是想知道您是否可以拥有一个名为One, two, three.jpg 的文件:)
  • @Alvaro 诚然这会导致计数错误,但话虽如此,您不应该使用同样可以存在于数据中的字符的分隔符。
  • @AndrewJackman - 我必须澄清一下,我无意批评你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
相关资源
最近更新 更多