MySQL加入 - 允许用户参加活动

时间:2014-03-22 15:45:09

标签: mysql sql join

我想创建一个简单的系统,以便用户可以参加活动。这将在三个表格中完成;用户,活动和出席。我创建了用户和事件表。

User table
+---------+----------+
| User_id | Username |
+---------+----------+
| 1       | User1    |
+---------+----------+
| 2       | User2    |
+---------+----------+

_

Event table
+----------+------------+
| Event_id | Event_name |
+----------+------------+
| 1        | Event1     |
+----------+------------+
| 2        | Event2     |
+----------+------------+

现在我想创建一个在我的网页上显示以下内容的表格。

+-------+--------------+----------+---------+------------+---------------+
| At_id | At_attending | Event_id | User_id | Event_name | User_username |
+-------+--------------+----------+---------+------------+---------------+
| 1     | N            | 1        | 1       | Event1     | User1         |
+-------+--------------+----------+---------+------------+---------------+
| 2     | N            | 1        | 2       | Event1     | User2         |
+-------+--------------+----------+---------+------------+---------------+
| 3     | N            | 2        | 1       | Event2     | User1         |
+-------+--------------+----------+---------+------------+---------------+
| 4     | N            | 2        | 2       | Event2     | User2         |
+-------+--------------+----------+---------+------------+---------------+

每个用户都应该拥有自己的" At_attending"对于每个活动,它将是' Y'或者' N'默认情况下,它应自动为N' N'我不确定如何使用合适的连接创建Attending表以接收我在最后一个表上所需的输出。

非常感谢。

2 个答案:

答案 0 :(得分:0)

您不必像创建的那样创建一个大表。

 At_id | At_attending | Event_id | User_id |
+------+--------------+----------+---------+

这就够了。然后Event_id是事件表的外键,User_id是用户表的外键。这将使您能够将行链接到其他表上的特定行。 More on foreign keys

CREATE TABLE Attenting
(
    At_id int NOT NULL,
    At_attending BIT(1) DEFAULT 0,
    Event_id int,
    User_id int,
    PRIMARY KEY (At_id),
    FOREIGN KEY (Event_id) REFERENCES Event(Event_id)
    FOREIGN KEY (User_id) REFERENCES User(User_id)
)

At_attending的类型为BIT,这意味着0可以解释为FALSE,1可以解释为TRUE。当然,您可以使用BOOLBOOLEAN,但在MySQL中,这些类型是TINYINT(1)的同义词。值为零被视为false。非零值被认为是真实的。

或者您可以使用CHAR(1)更轻松,仅支持TF(或YN)。但是您必须定义一个约束以确保该列只接受这两个字符。

如果您想查询表格作为示例,请使用JOIN - syntax

SELECT
    `User`.username AS User_username,
    `Event`.Event_name,
    `Attenting`.*
FROM
    `Attenting`
INNER JOIN
    `User`
ON
    `Attenting`.User_id = `User`.User_id
INNER JOIN
    `Event`
ON
    `Attenting`.Event_id = `Event`.Event_id

以上将选择三个表中的所有数据,并将显示为您的示例。 JOIN语法确保其他表可以连接到当前表。

Attenting.*将选择Attenting表中的所有列。

如果您想通过特定参数进行选择,只需在末尾添加WHERE即可。

答案 1 :(得分:0)

您将需要一个将用户与事件相关联的所谓JOIN表。我们称之为user_event。它将包含这两列。

 user_id
 event_id

这就是它所需要的一切。它不需要自己的ID号或其他任何东西。两列一起是表的主键。 user_event中存在一行意味着特定用户已注册参加特定事件。

要生成您显示的那种显示,请执行以下操作:

 SELECT u.user_id, 
        u.username,
        IF(ue.user_id IS NOT NULL, 'Y', 'N') AS attending,
        e.event_id,
        e.event_name
   FROM event AS e
  CROSS JOIN user AS u
   LEFT JOIN user_event AS ue ON ue.event_id = e.event_id 
                             AND ue.user_id = u.user_id
  ORDER BY u.user_id, e.event_id

这将为用户和事件的每个组合提供一行,并为Y或N说明特定用户是否参加。这是一个显示它的SQL小提示。

http://sqlfiddle.com/#!2/2ac9c/1/0