2013-02-05 65 views
0

我有一個mysql表category與字段events as varchar它的值是這樣的:11,29,32。和這個值referer到event表ID。 (所以我可以說:我在category表有幾個event IDevent表)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

太好了,非常感謝你,它的工作正常 –