我有一个名为users和table的表叫做事件。 每个用户集都是自己喜欢的“区号”。
每个事件都设置为某些区域代码,此信息保存在表格中:
events_areas:
area_id BIGINT
event_id BIGINT
我试图找到让用户选择自己的区号的好方法......然后在select语句中将其与事件区域代码匹配。
我想做与events_areas相同的事情并执行:users_areas:
area_id BIGINT
user_id BIGINT
但后来我不知道如何在select语句中匹配它们??
由于
答案 0 :(得分:0)
假设您列出的表格,以下内容将选择用户选择的区号中的所有事件。
SELECT u.*, e.*
FROM users u
JOIN users_areas ua
ON u.id = ua.user_id
JOIN events_areas ea
ON ea.area_id = ua.area_id
JOIN events e
ON ea.event_id = e.id
答案 1 :(得分:0)
select语句看起来像这样:
SELECT DISTINCT users.*, events.*
FROM users
JOIN users_areas ON users.user_id = users_areas.user_id
JOIN events_areas ON users_areas.area_id = event_areas.area_id
JOIN events ON events_areas.event_id = events.event_id
答案 2 :(得分:0)
好的,我根据你的评论改变了这个......
创建这些表:
Table: user
id
name
Table: user_area
id
user_id
area_id
Table: event
id
name
Table: event_area
id
event_id
area_id
Table: area
id
area_code
然后运行此查询:
SELECT event.name FROM event, event_area WHERE event.id = event_area.event_id AND event_area.area_id IN (SELECT area_id FROM user_area WHERE user_id = <CURRENTUSERSID>)
答案 3 :(得分:0)
以简单的英语开始列出表(对象)之间的关系很有用。例如:
两个语句都描述了多对多关系,因此您确实需要这两个表(有时称为交叉引用表)。
编写这些语句总是有助于理解问题并提出问题。假设上面的陈述是正确的,那么拥有这两个表users_areas
和events_areas
也是正确的。要构建select
语句,请注意两个表只有一列共有:area_id
(顺便说一句,适用于int
,使用bigint
是一个巨大的矫枉过正,我认为同样适用于user_id
和event_id
)。因此area_id
是您需要用来匹配它们的列(正确的术语是 join 它们)。
这是你的选择陈述:
SELECT ea.event_id, ea.area_id, ua.user_id
FROM events_areas ea
INNER JOIN user_areas ua ON ea.area_id = ua.area_id
或者,假设您还有event
表和user
表(可能就是这种情况),我们将select
扩展为如下所示:
SELECT e.name, u.name
FROM events_areas ea
INNER JOIN user_areas ua ON ea.area_id = ua.area_id
INNER JOIN users u ON u.user_id = ua.user_id
INNER JOIN events e ON e.event_id = ue.event_id
答案 4 :(得分:-1)
SELECT *
FROM users u
INNER JOIN users_areas ua
ON u.user_id = ua.user_id
INNER JOIN events_areas ea
ON ua.area_id = ea.area_id
INNER JOIN events e
ON ea.event_id = e.event_id