【问题标题】:how to join two tables如何连接两个表
【发布时间】:2013-01-07 07:17:00
【问题描述】:

我有两个表,分别是 EventTableVenueTable

我使用彼此的主键作为外键。表结构如下;

EventID|VenueID|EventName 
    1  |    1  | Event1 
    2  |    1  | Event2 
    3  |    2  | Event3 


VenueId|EnevtID|VenueNAme
   1   |   1   | Venue1 
   2   |   2   | Venue2 

我想要的结果如下;

VenueID | VenueName | EventID | EventName
   1    | Venue1    |  1      | Event1 
   1    | Venue1    |  2      | Event2 
   2    | Venue2    |  2      | Event2
   2    | Venue2    |  3      | Event3

我已经使用内部连接来做到这一点。但无法得到预期的结果。

如何做到这一点?

谢谢..

【问题讨论】:

  • Select v.VenuId,V.VenueName,E.EventId,E.EventName FROM Event E INNER JOIN Venue V ON E.EventID =V.EventID
  • 我认为您上面提到的表格有问题/缺失。在 EventTable 中,eventId 2 位于场地 1,而在 VenueTable 中,venueId 2 有事件 2。此外,在您的预期结果中,您提到 EventId 2 有两个与上述表格相矛盾的场地。
  • @rohanpanchal - 您的查询看起来不错。正如 Bhavik 提到的,您的表格可能缺少记录。
  • 在我看来,您的表结构不正确。您会看到,您已将 VenueId 和 EventId 关系分配到两个表。 VenueId = 2 和 EventId = 2 的关系映射在 Venue 表中,但不在 Events 表中。最好重组表并将所有事件放在事件表中,在EventsTable中映射eventId和VenueId之间的关系,并在Venue Table中只保留VenueId和VenueName。这样,连接查询将更容易实现并为您提供所需的结果。
  • @ Bhivik shah - 是 EventID 2 有 2 个场地,即 Venue1 和 Venue2 事件表 Reffer 场地 1 和 Venuetable Reffer EvnetID 2 即场地 2 那么如何加入这两个???

标签: mysql sql join


【解决方案1】:

试试这个:

SELECT
    v.VenueID,
    v.VenueName,
    v.EventID,
    e.EventName
FROM
    VenueTable v
INNER JOIN
    EventTable e 
    ON (v.EventId = e.EventId)

UNION

SELECT
    v.VenueID,
    v.VenueName,
    v.EventID,
    e.EventName
FROM
    VenueTable v
INNER JOIN
    EventTable e 
    ON (v.VenueID = e.VenueID)

这模拟了 MySQL 中的 FULL OUTER JOIN

【讨论】:

  • **MySQL 服务器版本,用于在 'FULL OUTER JOIN ** 附近使用正确的语法
  • 上述查询中没有FULL OUTER JOIN。再试一次 - 只复制代码块中的脚本。
  • @rohan - 正如 Sumit 在他对您的问题的评论中提到的那样,您真的应该考虑更改表格的设计。将两个键都存储在两个表中而不从中创建复合键不是一个好主意。
  • @ Nicrus - 我知道,但我无法更改表格 bcs 的设计,它会影响页面代码,并且需要在项目中进行很多更改,到目前为止工作正常,只有一件事是我需要的改变。
  • 好的。我的脚本对你有帮助吗?
【解决方案2】:

这应该可以解决问题:

 select VenueID, VenueName, EventID, EventName
    from EventTable, VenueTable
    where EventTable.VenueID = VenueTable.VenueID

记住mysql的分隔符

【讨论】:

  • 使用 ANSI JOIN 代替传统的 JOIN
  • 为什么这可以解决 OP 的问题?如果有两个表,并且其中任何一个的最多记录是 3 - 那么您将使用 INNER JOIN 返回的最多记录是 3...
  • 我将 op 解释为请求查询以获得结果,而不是必须使用内部联接,要么 op 必须澄清他的问题,或者我没有看到你的评论的目的?跨度>
  • 这是同一个查询,只是 OP 创建的 ANSI 形式。结果是问题,而不是查询的样式。
【解决方案3】:
SELECT v.VenueID, v.VenueName, v.EventID, e.EventName
FROM VenueTable v
INNER JOIN EventTable e  ON (v.EventId = e.EventId)

甚至

SELECT v.VenueID, v.VenueName, v.EventID, e.EventName
FROM VenueTable v, EventTable e 
WHERE v.EventId = e.EventId

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 2023-04-09
    • 2011-04-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    相关资源
    最近更新 更多