SQL 질문과 답변 게시판
Tag 관련 쿼리입니다.
* tags - TAG 이름만 있는 테이블
id || name
1 || 태그1
2 || 태그2
3 || 태그3
* bbs - 글 리스트
id || title
1 || 어쩌고1
2 || 어쩌고2
3 || 어쩌고3
4 || 어쩌고4
* tag - bbs 매핑 테이블
id || tag_id || bbs_id
1 || 1 || 1
2 || 2 || 1
3 || 3 || 2
4 || 1 || 3
특정 태그를 검색할때 AND 조건으로 묶으려고 합니다. 예를 들어 태그1 이면서 태그2 인건 검색하면 글 id 1 인게 나오는 형태로요..
AND 조건이므로 태그를 붙여 검색할 수록 검색 결과가 점점 작아져야 합니다.
어렵네요 도와주세요~~ ㅠㅠ
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
CREATE TABLE Favorite_Stock (
id INTEGER PRIMARY KEY,
code varchar(255) NOT NULL,
name varchar(255) NOT NULL,
user_name varchar(255) NOT NULL,
market varchar(255) NOT NULL
);
CREATE TABLE Tags (
id INTEGER PRIMARY KEY,
name varchar(255) NOT NULL
);
CREATE TABLE Favorites_tags (
id INTEGER PRIMARY KEY,
favorite INTEGER NOT NULL,
tags INTEGER NOT NULL
);
INSERT INTO Favorite_Stock (code, name, user_name, market) values ("000660", "하이닉스", "eastvision", "0001");
INSERT INTO Favorite_Stock (code, name, user_name, market) values ("005930", "삼성전자", "eastvision", "0001");
INSERT INTO Favorite_Stock (code, name, user_name, market) values ("000020", "동화약품", "eastvision", "0001");
INSERT INTO Tags (name) values ("관심주");
INSERT INTO Tags (name) values ("약품");
INSERT INTO Favorites_tags (favorite, tags) values (1,1);
INSERT INTO Favorites_tags (favorite, tags) values (2,1);
INSERT INTO Favorites_tags (favorite, tags) values (3,1);
INSERT INTO Favorites_tags (favorite, tags) values (3,2);
죄송합니다. 다시 여쭤볼게요~
위와 같이 세개의 테이블이 있구요 하나는 태그 이름만, 하나는 종목이, 다른 하나는 이 둘을 엮는 테이블입니다.
SELECT
favorite_stock.name, favorite_stock.code, favorite_stock.id
FROM favorite_stock
JOIN favorites_tags ON favorite_stock.id = favorites_tags.favorite
JOIN tags ON tags.id = favorites_tags.tags
where favorites_tags.tags=1;
이 세 테이블을 관심주라는 태그 명으로 검색하면 위와 같습니다. 이에 and 조건으로 관심주 이면서 약품 을 검색하려면 어케 해야하는건가요?? 태그를 검색할 수록 and로 붙어 검색 결과가 좁혀 져야합니다.
태그로 관심주와 약품을 동시에 가지고 있는 것은 "동화약품" 하나 이므로 이 하나만 검색이 되어야합니다.
CREATE TABLE
favorite_stock ( id INTEGER PRIMARY KEY, code varchar(255) NOT NULL, name varchar(255) NOT NULL, ); CREATE TABLE
favorites_tags ( id INTEGER PRIMARY KEY, favorite INTEGER
NOT NULL, tags INTEGER
NOT NULL ); INSERT INTO
Favorite_Stock VALUES (1, '000660', '하이닉스'); INSERT INTO
Favorite_Stock VALUES (2, '005930', '삼성전자'); INSERT INTO
Favorite_Stock VALUES (3, '000020', '동화약품'); INSERT INTO
Favorites_tags VALUES (1,1,1); INSERT INTO
Favorites_tags VALUES (2,2,1); INSERT INTO
Favorites_tags VALUES (3,3,1); INSERT INTO
Favorites_tags VALUES (4,3,2); --
DECLARE @query AS NVARCHAR(1000) DECLARE @condition AS VARCHAR(100) DECLARE @tag_count AS VARCHAR(10) SET @condition =
'1,2' -- 입력값으로받아야함 SET @tag_count =
'2' -- 입력값으로받아야함 SET @query =
'SELECT fs.name, fs.code, fs.id FROM favorites_tags ft JOIN favorite_stock fs ON
ft.favorite = fs.id GROUP BY fs.name, fs.code, fs.id HAVING SUM(CASE WHEN ft.tags IN (' +
@condition + ') THEN 1
ELSE 0 END) = ' + @tag_count EXEC sp_executesql
@query
이런 방법은 어떨까요..
@condition은 입력을 받으실때 1,2,3,4 이런식으로 넘겨 받아야하구요
@tag_count는 태그조건이 몇개인지도 넘겨 받아야합니다.
재밌네요 ^^
P.S. 쿼리분석기에서 워드에 붙여넣은 상태까지는 색깔이 제대로인데 워드에서 여기로 붙여 넣으면 색깔이 좀 변경되네요. 워드색깔 그대로 나오지 않는 이유가 뭘까요..? ㅠㅠ

jevida(강성욱)

기본적인 데이터 스크립트 올려주시면 빠른 답변이 달릴듯 합니다 ^^ 예제 데이터 생성 스크립 구문 첨부를 생활화 합시다