【问题标题】:SQL Inner Join statement not giving desired resultsSQL Inner Join 语句没有给出想要的结果
【发布时间】:2017-01-03 14:36:12
【问题描述】:

希望有人可以在这里帮助我。我有以下两个表:

Table: locations
location_id   user_id       city        state
1             1             Los Angeles CA  
2             1             New York    NY
3             1             Chicago     IL
4             2             Dallas      TX
5             3             Denver      CO
6             4             Miami       FL
7             5             Atlanta     GA

Table: events
event_id    user_id     event_name    event_date
1           1           My Event 1    2017-02-01
2           2           My Event 2    2017-03-01
3           3           My Event 3    2017-04-01
4           4           My Event 4    2017-05-01
5           5           My Event 5    2017-06-01

我正在运行以下查询:

SELECT e.event_id,  e.user_id, e.event_name, e.event_date,
       l.user_id, l.city, l.state
FROM events e
INNER JOIN locations l
ON e.user_id = l.user_id
ORDER BY e.event_date ASC

我试图只获取 events 表中的记录,但还要提取与两个表共有的 user_id 匹配的相应城市和州。输出应该是:

 event_id   user_id     event_name    event_date    city          state
 1          1           My Event 1    2017-02-01    Los Angeles   CA
 2          2           My Event 2    2017-03-01    Dallas        TX
 3          3           My Event 3    2017-04-01    Denver        CO
 4          4           My Event 4    2017-05-01    Miami         FL
 5          5           My Event 5    2017-06-01    Atlanta       GA

谁能指出我在 SQL 语句中的错误?

【问题讨论】:

  • user_id = 1 在哪个位置?为什么结果是洛杉矶,为什么不是纽约?
  • 只需要第一个,其余与user_id匹配的跳过
  • 先定义(按数据)
  • 声明中的哪个地方?
  • 那不是陈述,而是定义。如果您愿意,可以将其称为业务规则。您、您的经理、项目经理或业务人员应该提出它。除非定义了同一组中记录的顺序,否则“第一”一词没有任何意义。

标签: mysql select join inner-join


【解决方案1】:

您从来没有给我们提供逻辑来决定为给定用户选择哪个位置。一种方法是采用与给定用户关联的最小location_id

SELECT t1.*,
       COALESCE(t2.city, 'NA'),
       COALESCE(t2.state, 'NA')
FROM events t1
LEFT JOIN locations t2
    ON t1.user_id = t2.user_id
INNER JOIN
(
    SELECT user_id, MIN(location_id) AS min_location_id
    FROM locations
    GROUP BY user_id
) t3
    ON t2.user_id = t3.user_id AND
       t2.location_id = t3.min_location_id

【讨论】:

    【解决方案2】:

    这完全不可能,这里的问题是对于 ID 为 1 的用户,locations 表中有 3 个元组,选择哪个城市是个大问题。

     1             1             Los Angeles CA  
     2             1             New York    NY
     3             1             Chicago     IL
    

    【讨论】:

    • 我当然了解所有问题。我应该更清楚。由于没有办法知道,我需要确保我抓住唯一的第一个匹配实例而不是其他实例。所以在这种情况下,对于 user_id 1,它只会拉出 Los Angeles CA。抱歉,我正在使用几年前我的其他人建立的结构:-(。
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多