[질문] 현재 레코드와 다음 레코드의 차을 비교 하여 다른 테이

hurryon의 이미지

테이블은 다음과 같습니다.

mysql> desc data_info;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| code  | char(5) |      | PRI |         |       |
| start | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> desc code_info;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| code    | char(5)     |      | PRI |         |       |
| start   | int(11)     | YES  |     | NULL    |       |
| size    | smallint(6) | YES  |     | NULL    |       |
| cutline | smallint(6) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql>

현재 data_info 테이블에는 값이 저장되어 있는 상태이고 code_info 테이블
에는 code와 start 필드만이 값이 저장되어 있습니다.

다음과 같은 쿼리을 썻죠.

insert into code_info (code, start) select distinct * from data_info group by code

어쨌든 data_info 테이블의 내용은 다음과 같습니다.

mysql> select * from data_info;
+-------+-------+
| code  | start |
+-------+-------+
| 01110 |     1 |
| 01121 |    16 |
| 01122 |    31 |
| 01123 |    46 |
| 01131 |    61 |
+-------+-------+
5 rows in set (0.00 sec)

mysql>

더 많은 레코드가 있는데 위의 예에는 5개만. :-) 위의 테이블에서 현재 레코드
와 다음 레코드의 start 필드의 값의 차을 code_info 테이블의 size 필드에
넣고 싶습니다.

그럼 아마도 다음과 같이 될것입니다.
코드 (01110) 스타트(1) 사이즈(15)
이런식으로 쭉 code_info 테이블에 값을 넣고 싶은데 쿼리문 하나로
해결할수는 없을까요?

물론 쿼리문을 때릴때 프로그램에서 변수을 지정해 놓고 다음 레코드의 값과
현재 레코드의 값을 비교하면서 테이블에 넣을수도 있지만 그렇게 하면
속도가 현져히 떨어 질거 같아서요.

hurryon의 이미지

쿼리을 다음과 같이 간단히 해도 되겠네요.

mysql> insert into code_info ( code, start ) select * from data_info;
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> select * from code_info;
+-------+-------+------+---------+
| code  | start | size | cutline |
+-------+-------+------+---------+
| 01110 |     1 | NULL |    NULL |
| 01121 |    16 | NULL |    NULL |
| 01122 |    31 | NULL |    NULL |
| 01123 |    46 | NULL |    NULL |
| 01131 |    61 | NULL |    NULL |
+-------+-------+------+---------+
5 rows in set (0.00 sec)

저 위의 커리을 좀 수정하면 될거 같은데요...으흠...

hurryon의 이미지

mysql> select code, count(did) from did_code group by code;
+-------+------------+
| code  | count(did) |
+-------+------------+
| 01110 |         15 |
| 01121 |         15 |
| 01122 |         15 |
| 01123 |         15 |
| 01131 |         15 |
| 01132 |         15 |
| 01140 |         15 |
| 01151 |         15 |
| 01152 |         15 |
| 01159 |         15 |
| 01211 |         15 |
| 01212 |         15 |
| 01220 |         15 |
| 01231 |         15 |
| 01239 |         15 |
| 01291 |         15 |
| 01299 |         15 |
| 01300 |          8 |
| 01410 |         15 |
| 01421 |         15 |
| 01422 |         15 |
| 01429 |         15 |
| 01430 |         15 |
| 01500 |          1 |
| 02011 |          9 |
| 02012 |         17 |
| 02013 |          8 |
| 02020 |          6 |
| 02030 |         19 |

이렇게 하니...차을 구할수가 있긴 한데...여러 테이블에서 값을 가져와 하나의
테이블에 값을 넣으려니...잘 안되네요.

T.T

오늘도 막차타고 가야 겠네.

mysql> select * from data_info;
+-------+-------+
| code  | start |
+-------+-------+
| 01110 |     1 |
| 01121 |    16 |
| 01122 |    31 |
| 01123 |    46 |
| 01131 |    61 |
+-------+-------+
5 rows in set (0.00 sec)

mysql> select code, count(did) from did_code group by code;
+-------+------------+
| code  | count(did) |
+-------+------------+
| 01110 |         15 |
| 01121 |         15 |
| 01122 |         15 |
| 01123 |         15 |
| 01131 |         15 |
| 01132 |         15 |
| 01140 |         15 |
| 01151 |         15 |
| 01152 |         15 |
| 01159 |         15 |
| 01211 |         15 |
| 01212 |         15 |
| 01220 |         15 |
| 01231 |         15 |
| 01239 |         15 |
| 01291 |         15 |
| 01299 |         15 |
| 01300 |          8 |
| 01410 |         15 |
| 01421 |         15 |
| 01422 |         15 |

...

(양이 좀 많아서 생략)

위의 두개의 쿼리을 하나로 합칠려고 합니다. 아마도 group by 절 때문에 그런거 같은데...으흠...
저는 이렇게 쿼리을 날렸습니다.

mysql> select data_info.code, data_info.start, count(did_code.did) from data_info, did_code group by 
did_code.code;
+-------+-------+---------------------+
| code  | start | count(did_code.did) |
+-------+-------+---------------------+
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  40 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                   5 |
| 01110 |     1 |                  45 |
| 01110 |     1 |                  85 |
| 01110 |     1 |                  40 |
| 01110 |     1 |                  30 |
| 01110 |     1 |                  95 |
| 01110 |     1 |                  75 |
| 01110 |     1 |                  75 |

(생략)

으흠...카운트 된 결과값도 이상하게 나오고...code나 start도 이상하게 나옵니다. 어떻게 하면 한번의 쿼리로
제대로 나오게 할수 있을지요?

hurryon의 이미지

흐. 해결했습니다. 혹시라도 참고하세요.

insert into code_info (code, start, size) select a.code, a.start, count(b.did) from data_info a join did_code b on a.code = b.code group by a.code, a.start;

:-)

조인연산에 대해 좀 더 봐야 할거 같네요. 음냐. 거의 반나절이 넘게 고생했던걸
정말 우리 팀장(여자)은 1-2분 만에 답에 가까운 쿼리을 알려 주세요.

짬밥은 무서운가 봅니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.