database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 26474 게시물 읽기
No. 26474
group by 만으로 해결이 불가능할까요?
작성자
ido97
작성일
2007-03-08 14:56ⓒ
2007-03-08 15:05ⓜ
조회수
2,505

mysql 을 다루기 시작한지 얼마안되었는데...

오라클에서 아주 간단한 쿼리만 날리다가...

DB 공부를 시작하고 있는데

한가지 궁금해서요....


고수님들 저에게 도움을 주심 감사~ ㅠ.ㅠ

버전은 5.0 입니다.


====================================================

select a.ms_seq, b.ms_title, a.c_seq, a.c_title

from tbl_content a, tbl_menu_sub b

where a.ms_seq = b.ms_seq

order by a.ms_seq, a.c_seq desc

====================================================


이런 쿼리를 쓰면 결과가 아래와 같이 나옵니다.


ms_seq ms_title c_seq c_title
1 최신뉴스 3 뉴스3
1 최신뉴스 2 뉴스2
1 최신뉴스 1 뉴스1
2 연예정보 7 연예정보4
2 연예정보 6 연예정보3
2 연예정보 5 연예정보2
2 연예정보 4 연예정보1
3 TV 방송 15 방송4
3 TV 방송 13 방송3
3 TV 방송 10 방송2
3 TV 방송 9 방송1
4 기타 14 기타4
4 기타 12 기타3
4 기타 11 기타2
4 기타 8 기타1



이걸 다시 아래와 같이 (비고란 빼고, 굵은글자만 출력)


비고 ms_seq 또는 c_seq ms_title 또는 c_title 비고
ms_seq 1 최신뉴스 ms_title
c_seq 3 뉴스3 c_title
c_seq 2 뉴스2 c_title
ms_seq 2 연예정보 ms_title
c_seq 7 연예정보4 c_title
c_seq 6 연예정보3 c_title
ms_seq 3 TV 방송 ms_title
c_seq 15 방송4 c_title
c_seq 13 방송3 c_title
ms_seq 4 기타 ms_title
c_seq 14 기타4 c_title
c_seq 12 기타3 c_title



ms_seq별로 두개씩


뽑고 싶은데 불가능할까요?


이 글에 대한 댓글이 총 3건 있습니다.
검색해 보니 이대규님이 2005-07-28 23:33:08에 작성한 댓글입니다. 
데이타가 많을때 시간이 좀 오래 걸리겠네요.
응용해 보세요.

mysql> SELECT * FROM atable;

+------+-------+

| id | grade |

+------+-------+

| A | 4 |

| A | 3 |

| A | 2 |

| A | 1 |

| B | 5 |

| B | 4 |

| B | 3 |

| B | 2 |

| B | 1 |

+------+-------+

9 rows in set (0.00 sec)

 

mysql> SELECT A1.id, A1.grade, COUNT(*) AS rank

-> FROM

-> atable AS A1

-> LEFT OUTER JOIN

-> atable AS A2

-> ON (A1.id = A2.id AND A1.grade <= A2.grade)

-> GROUP BY A1.id, A1.grade

-> HAVING rank <= 3

-> ORDER BY A1.id, A1.grade DESC

-> ;

+------+-------+------+

| id | grade | rank |

+------+-------+------+

| A | 4 | 1 |

| A | 3 | 2 |

| A | 2 | 3 |

| B | 5 | 1 |

| B | 4 | 2 |

| B | 3 | 3 |

+------+-------+------+

6 rows in set (0.00 sec)

 

mysql> explain SELECT A1.id, A1.grade, COUNT(*) AS rank

-> FROM

-> atable AS A1

-> LEFT OUTER JOIN

-> atable AS A2

-> ON (A1.id = A2.id AND A1.grade <= A2.grade)

-> GROUP BY A1.id, A1.grade

-> HAVING rank <= 3

-> ORDER BY A1.id, A1.grade DESC

-> ;

+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+

| 1 | SIMPLE | A1 | ALL | NULL | NULL | NULL | NULL | 9 | Using temporary; Using filesort |

| 1 | SIMPLE | A2 | ALL | NULL | NULL | NULL | NULL | 9 | |

+----+-------------+-------+------+---------------+------+---------+------+------+---------------------------------+

2 rows in set (0.00 sec)

 

인덱스를 걸어줬더니 좀 나은 모양이 되었습니다.

 

mysql> CREATE INDEX idx ON atable (id, grade);

Query OK, 9 rows affected (0.07 sec)

레코드: 9개 중복: 0개 경고: 0개

 

mysql> explain SELECT A1.id, A1.grade, COUNT(*) AS rank

-> FROM

-> atable AS A1

-> LEFT OUTER JOIN

-> atable AS A2

-> ON (A1.id = A2.id AND A1.grade <= A2.grade)

-> GROUP BY A1.id, A1.grade

-> HAVING rank <= 3

-> ORDER BY A1.id, A1.grade DESC

-> ;

+----+-------------+-------+-------+---------------+------+---------+--------------+------+----------------------------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+-------+---------------+------+---------+--------------+------+----------------------------------------------+

| 1 | SIMPLE | A1 | index | NULL | idx | 5 | NULL | 9 | Using index; Using temporary; Using filesort |

| 1 | SIMPLE | A2 | ref | idx | idx | 3 | ymovie.A1.id | 4 | Using index |

+----+-------------+-------+-------+---------------+------+---------+--------------+------+----------------------------------------------+

2 rows in set (0.00 sec)

정왕균(아레아)님이 2007-03-08 18:25에 작성한 댓글입니다.

네, 저도 검색해서 찾았던 내용입니다.

문제는 메뉴별로 중간에 ms_seq와 ms_title을 어찌 끼워넣을까인데요..

비고 ms_seq 또는 c_seq ms_title 또는 c_title 비고
ms_seq 1 최신뉴스 ms_title
c_seq 3 뉴스3 c_title
c_seq 2 뉴스2 c_title
ms_seq 2 연예정보 ms_title
c_seq 7 연예정보4 c_title
c_seq 6 연예정보3 c_title
ms_seq 3 TV 방송 ms_title
c_seq 15 방송4 c_title
c_seq 13 방송3 c_title
ms_seq 4 기타 ms_title
c_seq 14 기타4 c_title
c_seq 12 기타3 c_title


이건 어찌하는 걸까요?
ido97님이 2007-03-08 19:49에 작성한 댓글입니다. Edit

끼워 넣는 것은 가능은 하겠지만 불가능하다고 봐야죠. 

컬럼을 따로 두고 불러오면 되고 불러오다 컬럼의 값이 바뀌는 것으로 구분하면 되겠네요. 

쿼리문 결과값을 불러오는 구조에 대해 고민해 보세요.

정왕균(아레아)님이 2007-03-10 14:54에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
26477Navi Cat 에서 TEXT 필드가 (memo) 이렇게 나오고 편집이 안되요
심상규
2007-03-09
1498
26476mysql upgrade 문제 해결 부탁드립니다. [1]
쭈니쏘리
2007-03-08
1648
26475한글 표시가 안됩니다. [3]
최장헌
2007-03-08
3173
26474group by 만으로 해결이 불가능할까요? [3]
ido97
2007-03-08
2505
26473주석 [1]
눈꽃햇살
2007-03-08
1850
26472View에 insert [1]
눈꽃햇살
2007-03-08
1863
26471쿼리질문(조건에 해당하는 컬럼명만 출력)
ghg
2007-03-08
1590
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다