我想创建一个简单的系统,以便用户可以参加活动。这将在三个表格中完成;用户,活动和出席。我创建了用户和事件表。
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表以接收我在最后一个表上所需的输出。
非常感谢。
答案 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。当然,您可以使用BOOL
或BOOLEAN
,但在MySQL中,这些类型是TINYINT(1)
的同义词。值为零被视为false。非零值被认为是真实的。
或者您可以使用CHAR(1)
更轻松,仅支持T
和F
(或Y
和N
)。但是您必须定义一个约束以确保该列只接受这两个字符。
如果您想查询表格作为示例,请使用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小提示。