0

categoryvarcharとしてフィールドを持つ mysqlテーブルがeventsあり、その値は次のようになります。11,29,32この値はeventテーブル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およびcategory2つの間に結合テーブルがあります。クエリの対象となるデータをコンマ区切りのリストに保存しないでください。

テーブル構造を変更できない場合は、MySQL関数を使用できますFIND_IN_SET()

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

SQL FiddlewithDemoを参照してください

テーブルを変更できる場合、構造は次のようになります。

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_SETは、にe.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 に答える