【问题标题】:Displaying rows of data in columns in MySQL在 MySQL 的列中显示数据行
【发布时间】:2019-07-30 14:51:24
【问题描述】:

我有一个与足球比赛相关的关系数据库结构,我正在尝试在 MySQL 中创建一个视图,该视图将允许我只显示我希望用户看到的字段。

问题在于match_result 表包含的行数是match_main 的两倍,因为主客场俱乐部的进球数在此表中作为单独的记录进行记录。

我想在一个视图中显示以下字段:

• match_id
• status_no
• 季节
• 日期时间
• 体育场名称
• 出席
referee_name(referee_first_name 和 referee_last_name 连接)
home_club
home_goal
away_club
away_goal
• bbc_url
• sky_url

  • 以粗体列出的字段名称实际上并不存在于数据库中。
  • match_result 中的 home_team 字段是一个布尔字段,用于确定俱乐部是在主场 (1) 还是客场 (0)

我的数据库结构如下:

到目前为止,这是我的代码。它返回最大记录数 (4940),即播放的唯一匹配总数:

 SELECT 
        match_main.match_id AS match_id,
        season.season AS Season,
        CONCAT(referee.referee_first_name,' ',referee.referee_last_name) AS `Referee`,
        match_status.status_no AS Status,
        match_main.attendance AS Attendance,
        match_main.date_time` AS Date,
        match_main.bbc_url` AS 'BBC URL'
        match_main.sky_url` AS 'Sky URL'
    FROM
        match_main
        LEFT JOIN referee ON ((match_main.referee_id = referee.referee_id)))
        LEFT JOIN season ON ((match_main.season_id = season.season_id
        LEFT JOIN match_status ON ((match_main.status_id = match_status.status_id)))

这段代码输出:

【问题讨论】:

  • Imo,你不需要UNION 来完成这项工作。您可以为match_result 表创建两个连接,一个用于主队,一个用于客队。这将允许您根据需要在一行中返回两个团队

标签: mysql sql database join union


【解决方案1】:

正如我在评论中提到的,您可以通过在 match_result 表中创建两个 JOINs 来实现此目的,这将允许您选择性地加入主客场俱乐部:

SELECT 
        match_main.match_id AS match_id,
        season.season AS Season,
        CONCAT(referee.referee_first_name,' ',referee.referee_last_name) AS `Referee`,
        match_status.status_no AS Status,
        match_main.attendance AS Attendance,
        match_main.date_time` AS Date,
        match_main.bbc_url` AS 'BBC URL',
        match_main.sky_url` AS 'Sky URL',
        c1.club_name AS home_club,
        mr1.goal AS home_goal,
        c2.club_name AS away_club,
        mr2.goal AS away_goal
    FROM
        match_main
        LEFT JOIN referee ON ((match_main.referee_id = referee.referee_id)))
        LEFT JOIN season ON ((match_main.season_id = season.season_id
        LEFT JOIN match_status ON ((match_main.status_id = match_status.status_id)))
        LEFT JOIN match_result mr1 ON ((mr1.match_id = match_main.match_id AND mr1.home_team = 1))
        LEFT JOIN club c1 ON ((c1.club_id = mr1.club_id))
        LEFT JOIN match_result mr2 ON ((mr2.match_id = match_main.match_id AND mr2.home_team = 0))
        LEFT JOIN club c2 ON ((c2.club_id = mr2.club_id))

在上述未测试代码中,match_resultclub 表有两个独立的JOINs。这使您可以将主队和客队作为同一行中的单独列返回。

这是完全有效的,使用单独的表别名可以实现这一点。 mr1c1 是主队的表别名,mr2c2 是客队的别名。

match_mainmr1 \ mr2 表格之间的 JOIN 位于 home_team 列上,允许根据您的表格结构在主队和客队之间进行选择。

【讨论】:

  • 让它看起来很简单!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多