Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL如何从2个表中选择并匹配它们_Mysql_Sql - Fatal编程技术网

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

Mysql SQL如何从2个表中选择并匹配它们,mysql,sql,Mysql,Sql,我有一个名为users的表和一个名为events的表。 每个用户都设置了自己的首选区号 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 每个事件都设置为某些区号,并且此信息保存在表格中: events_areas: area_

我有一个名为users的表和一个名为events的表。 每个用户都设置了自己的首选区号

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
每个事件都设置为某些区号,并且此信息保存在表格中:

events_areas:
area_id BIGINT
event_id BIGINT
我正试图找到一个好办法,让用户选择是自己的区号。。。然后在select语句中将其与事件区域代码匹配

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
我想做的事情和事件区和do:users\u区一样:

area_id BIGINT
user_id BIGINT
但是我不知道如何在select语句中匹配它们


谢谢

假设您列出了这些表,下面将选择用户所选区号中的所有事件

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

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

好的,我根据你的评论修改了这个

创建以下表格:

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

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

一个用户属于一个区号,而一个区号有多个用户。 一个事件发生在一个区号中,而一个区号有许多事件。 这两个语句都描述了多对多关系,所以您确实需要这两个表,有时称为交叉引用表

写这些陈述总是有助于理解问题并提出问题。假设上面的陈述是正确的,那么拥有这两个表users\u区域和events\u区域也是正确的。要构建select语句,请注意,两个表只有一个共同的列:area\u id,顺便说一下,它可以放在一个int中,使用bigint是一个巨大的过度使用,我认为user\u id和event\u id也是如此。因此area\u id是您需要用来匹配它们的列。正确的术语是连接它们

以下是您的选择声明:

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
或者,假设您还有一个事件表和一个用户表(很可能是这样),我们将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
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

对不起,我试图让每个用户选择许多区号,同样的事件。。。例如,如果事件得到区号:1,3,4,而用户得到的区号是:3,5,8-这是匹配的。我明白你关于理解问题的观点,谢谢。而且你是对的,我会尝试你的解决方案。谢谢选民是否愿意解释他们的反对意见?