2011-11-30 2 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     | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 

내 문제 그리고 나의 시도가 있습니다

나 이

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
+ 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 이상 사용 (모든 서버에서 제한은 1024kb입니다.) 그래서 파일 사이에 사용 구분 기호를 가져오고 싶습니다. ","

이 내 쿼리

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

결과 테이블이 약간 잘못되었다고 생각합니다. 3의 tic_id에 대해 2 (com_files), 4의 tic_id에 count_ (com_files)에 대해 0이어야합니다. –

+0

이 디자인은 일종의 미친 짓입니다. 그것을 고칠 너무 늦었습니까? –

+0

@Andrew Jackman, 질문을 편집하십시오. –

답변

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.jpg56a4sdasd.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'라는 파일을 가질 수 있는지 궁금합니다. –