2013-02-05 2 views
0

필드 값이 11,29,32 인 varchar로 필드가 events 인 mysql 테이블 category이 있습니다.이 값은 event 테이블 ID로 참조됩니다. (그래서 내가 말할 수 있습니다 : 내가 category 테이블에 event 테이블에서 여러 event ID가)MYSQL 조건

그래서 내가 그런 category에서 events을 선택합니다 :

SELECT * 
FROM      
event e, category c              
where e.event_id in (c.events) 

그러나 때 내가 대신 정확한 결과를 제공하지 않는 것이 수동으로 같은 값을 넣어 : 나는 그것이 분명 희망

SELECT * 
FROM      
event e, category c              
where e.event_id in (11,29,32) 

도와주세요

답변

4

문제의 일부는 테이블을 설정 한 방법입니다. 일반적으로 events, category이 있고 두 테이블 사이에 조인 테이블이 있습니다. 쿼리 할 데이터를 쉼표로 구분하여 저장하면 안됩니다. 당신이 당신의 테이블 구조를 변경할 수없는 경우

, 당신은 MySQL의 기능 FIND_IN_SET()을 사용할 수 있습니다 : 당신이 당신의 테이블을 변경할 수있는 경우

SELECT * 
FROM event e 
INNER JOIN category c              
    on find_in_set(e.event_id, c.events) 

SQL Fiddle with Demo

를 참조하십시오, 다음 구조가 있어야한다 :

create table events 
(
    event_id int not null auto_increment primary key, 
    event_name varchar(50) not null 
); 

create table category 
(
    cat_id int not null auto_increment primary key, 
    cat_name varchar(50) not null 
); 

create table events_category 
(
    event_id int not null, 
    category_id int not null, 
    PRIMARY KEY(event_id, category_id), 
    constraint fk_event 
    foreign key (event_id) references events (event_id), 
    constraint fk_category 
    foreign key (category_id) references category (cat_id) 
); 

데이터를 쿼리 할 때 다음을 사용하십시오.

select * 
from events e 
left join events_category ec 
    on e.event_id = ec.event_id 
left join category c 
    on ec.category_id = c.cat_id 
+1

매우 좋습니다 쉼표로 구분 된 값을 행에 저장하여 구조가 변경되면 데이터베이스가 제공 할 수있는 많은 힘을 제거 할 수 있습니다. – Zane

+0

네, 그렇습니다. 나는이 함수가 FIND_IN_SET (위의 내용)을 찾았음에도 동의합니다. 대단히 감사합니다. @bluefeet –

+0

죄송합니다.하지만 events_category의 기본 키는 무엇입니까? –

0

카테고리와 이벤트 사이에 다 대다 관계를 만들려고하는 것처럼 보입니다. 그렇다면이 관계를 매핑하는 테이블을 포함하도록 디자인을 리팩터링해야합니다.

category 
-------- 
- id 
- name 

event 
----- 
- id 
- name 

category_to_event 
----------------- 
- id 
- category_id 
- event_id 

이러한 유형의 구조를 만들면 원하는 쿼리를 수행 할 수 있습니다.

+0

'category_to_event' 테이블에 추가'id' 필드를 포함 할 필요가 없습니다. 다른 두 필드의 자연 키를 PK로 사용한 다음 다른 테이블에 외래 키를 사용할 수 있습니다. – Taryn

+0

감사합니다. 내 개념을 바꿀 것입니다. 그게 굉장합니다. –

2

당신은 FIND_IN_SET를 사용할 수 있습니다

SELECT * 
FROM event e INNER JOIN category c 
    ON FIND_IN_SET(e.event_id, c.events) 

FIND_IN_SET 0 e.event_id 경우가 c.events에 존재하지 않는 반환, 그렇지 않으면 그 위치를 반환합니다. 결과 값이 0보다 크면 조인이 성공합니다.

+0

대단히 감사합니다. 괜찮습니다. –