SQL如何从2个表中进行选择并匹配它们

时间:2012-02-29 17:20:25

标签: mysql sql

我有一个名为users和table的表叫做事件。 每个用户集都是自己喜欢的“区号”。

每个事件都设置为某些区域代码,此信息保存在表格中:

events_areas:
area_id BIGINT
event_id BIGINT

我试图找到让用户选择自己的区号的好方法......然后在select语句中将其与事件区域代码匹配。

我想做与events_areas相同的事情并执行:users_areas:

area_id BIGINT
user_id BIGINT

但后来我不知道如何在select语句中匹配它们??

由于

5 个答案:

答案 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)

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

  1. 用户属于区号,区号有很多用户。
  2. 区域代码中发生事件,区号中有许多事件。
  3. 两个语句都描述了多对多关系,因此您确实需要这两个表(有时称为交叉引用表)。

    编写这些语句总是有助于理解问题并提出问题。假设上面的陈述是正确的,那么拥有这两个表users_areasevents_areas也是正确的。要构建select语句,请注意两个表只有一列共有:area_id(顺便说一句,适用于int,使用bigint是一个巨大的矫枉过正,我认为同样适用于user_idevent_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