2012-02-29 110 views
0

我有一个称为用户和表的表称为事件。 每个用户都是自己喜欢的“区号”。SQL如何从两个表中选择并匹配它们

每个事件都设置为某个地区代码,并将此信息保存在一个表:

events_areas: 
area_id BIGINT 
event_id BIGINT 

我想找到一个好办法,让用户选择是自己的区号?然后用选择语句与事件区域代码进行匹配。

我因子评分做同样的events_areas做:users_areas:

area_id BIGINT 
user_id BIGINT 

但我不知道如何在SELECT语句中匹配他们...?

感谢

回答

-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 
+0

匿名downvoter会照顾解释他们的反对吗? – 2012-02-29 17:43:39

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 
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 
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>) 
+0

对不起,我试图让每个用户选择许多地区代码,并为事件相同...然后例如,如果事件得到区号:1,3,4和用户得到的是代码:3,5,8 - 它匹配 – Amir 2012-02-29 17:28:49

0

以简单的英语开始列出表格(对象)之间的关系很有用。例如:

  1. 用户属于区号,区号有很多用户。
  2. 一个事件发生在一个地区代码和一个地区代码有很多事件。

两个语句描述许多一对多的关系,所以你需要这两个表(有时称为交叉引用表)。

编写这些语句总是有助于理解问题并提出相关问题。假设以上陈述是正确的,那么使用这两个表users_areasevents_areas也是正确的。要构建select说法,请注意,这里只有一个两个表有共同的列:area_id(其中的方式,将适合在int,使用bigint巨大矫枉过正,而且我认为这同样适用于user_idevent_id)。所以area_id是你需要用到的列匹配他们(正确的名词是加入他们)。

这是你的SELECT语句:

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 
+0

我明白了你对问题的理解,谢谢。而且你是对的,我会尝试你的解决方案。谢谢! – Amir 2012-02-29 17:34:34

相关问题