0

我有一个 mysql 表category,其字段 events为 varchar,其值如下所示:11,29,32.and this values referer to eventtable ID。(所以我可以说:我有几个表中的event ID表)eventcategory

所以我想从中events选择 category

 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

3 回答 3

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

如果你可以改变你的表,那么结构应该是:

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
于 2013-02-05T16:08:57.937 回答
2

您可以使用FIND_IN_SET

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

如果 FIND_IN_SETe.event_id中不存在,则返回 0 c.events,否则返回其位置。如果结果值大于 0,则连接将成功。

于 2013-02-05T16:08:09.883 回答
0

看起来您正在尝试在类别和事件之间创建多对多关系。如果是这种情况,您确实需要重构您的设计以包含一个映射此关系的表。

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

event
-----
- id
- name

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

创建这种类型的结构将允许您执行您寻求的查询。

于 2013-02-05T16:06:01.887 回答