1

愛するオーバーフローの皆さん、こんにちは。いつものように、それは大歓迎です!:)

複数のカテゴリ (タグとして使用) を割り当てることができるイベント テーブルがあります。

次に、Categories (各タグを格納) と Events_Categories (リンク テーブル) を用意します。

**Events**
| id  | event_name |
+------------+
+ 1   | Basketball
+ 2   | Children Charity Ball
+ 3   | Bowling Charity Event


**Event_Categories** (Stores Tags / Categories)
| id  | name |
+------------+
+ 1   | sport
+ 2   | charity
+ 3   | other_tag


**Events_Categories** (Linking Table)
| event_id  | event_category_id |
+-------------------------------+
+    1      |       1   
+    2      |       2   
+    3      |       1   
+    3      |       2   

上記のまとめ

Basketball            => Sports 
Children Charity Ball => Charity 
Bowling Charity       => Charity & Sports 

望ましい結果

そのタグを持つすべてのイベントを返す「スポーツ」タグを検索できるようにしたいと考えています。ただし、その特定のイベントに関連付けられたすべてのタグを返す (およびグループ化する) 必要があります。

IE で「Sport」タグを検索すると、次のように返されます。

**Events**
| id  |       event_name      |  tags         |
+---------------------------------------------+
+ 1   | Basketball            | sport
+ 3   | Bowling Charity Event | sport, charity

WHERE 条件なしでイベントを返す SQL の例: 次の SQL は、すべてのイベントを返し、カテゴリ (またはタグ) をグループ化します。これにより、私のDB構造のアイデアが得られるはずです。おそらく解決策に役立ちますか?

SELECT e.*, group_concat(c.name) as tags
FROM `events` e 
JOIN `events_categories` ec
    ON e.`id` = ec.`event_id` 
JOIN `event_categories` c
     ON ec.`event_category_id` = c.`id`
GROUP BY e.`id`;

追加の質問 (追加のブラウニー ポイントについて)

信じられますか、彼はもっと助けを求めています!! :)

また、リンク テーブルには、イベントがアクティビティにリンクする場合の別のフィールドが実際にあります。

**Events_Categories** (Linking Table)
| event_id  | event_category_id | activity_id |
+---------------------------------------------+
+    1      |       1           |     1
+    2      |       2           |
+    3      |       1           |     2
+    3      |       2           |     2

[x] のアクティビティ ID を使用してイベントを検索し、すべてのタグをグループ化してイベントの詳細を返す方法は次のとおりです。

関連付けられた 2 つの Activity_ID にリンクするイベント

| id  |       event_name      |  tags          | activity_id |
+------------------------------------------------------------+
+ 3   | Bowling Charity Event | sport, charity |     2

どうもありがとう、もう一度!

4

1 に答える 1

2

これはあなたの質問の最初の部分に答えます。イベントに含まれるすべてのカテゴリのリストを取得するには、 を使用EXISTSして、検索イベント名の少なくとも一部がイベントに含まれているかどうかを確認できます。

SELECT  a.ID,
        a.Event_name,
        GROUP_CONCAT(c.Name)
FROM    Events a
        INNER JOIN Events_Categories b
            ON a.ID = b.event_ID
        INNER JOIN Event_Categories c
            ON b.event_category_id = c.ID
WHERE   EXISTS
        (
            SELECT  1
            FROM    Events_Categories d
                    INNER JOIN Event_Categories e
                        ON d.event_category_id = e.id 
            WHERE   e.Name = 'Sport' AND
                    d.event_id = a.id
        )
GROUP   BY  a.ID,
            a.Event_name

更新 1

SELECT  a.ID,
        a.Event_name,
        GROUP_CONCAT(c.Name) CategoryList,
        MAX(activity_id) activity_id
FROM    Events a
        INNER JOIN Events_Categories b
            ON a.ID = b.event_ID
        INNER JOIN Event_Categories c
            ON b.event_category_id = c.ID
GROUP   BY  a.ID, a.Event_name
HAVING  MAX(activity_id) = 2
于 2013-08-04T20:34:06.287 に答える