【问题标题】:Searching multiple tables in MySQL database在 MySQL 数据库中搜索多个表
【发布时间】:2015-05-13 03:31:49
【问题描述】:

我的数据库 (mySQL) 中有几个不同的表。

这里是表格的相关列

table_tournaments

  1. 比赛编号
  2. tournamnetName
  3. 比赛状态

table_tournament_results

  1. 比赛编号
  2. 玩家ID
  3. 玩家姓名
  4. 玩家等级
  5. tournamnet 参与者

table_players

  1. 玩家ID
  2. 玩家姓名

锦标赛表包含有关锦标赛的信息,锦标赛结果表显示该表的结果

我想按名称搜索锦标赛表,然后根据返回的结果从锦标赛结果表中获取信息。

    SELECT * FROM `tournaments` `WHERE` `tournamentName` LIKE "%Query%"

我不知道该怎么做,也许我需要通过PHP 做点什么,感谢所有帮助。

【问题讨论】:

  • tournamnetParticipants
  • 这是参加比赛的人数。

标签: php mysql


【解决方案1】:

您可以通过 join 操作获得您想要的结果。

这是一个外连接的示例,返回来自t且字符串'foo'作为tournament_name的一部分出现的所有行,以及来自r的任何匹配行.

两个表中的行之间的关系是通过在两个表的tournamentId 列中存储一个公共值来建立的。 ON 子句中的谓词指定确定行是否“匹配”的条件。

 SELECT t.tournamentId
      , t.tournamentName
      , t.tournamentStatus
      , r.playerId
      , r.playerName
      , r.playerRank
   FROM table_tournaments t
   LEFT
   JOIN table_tournament_results r
     ON r.tournamentId = t.tournamentId
  WHERE t.tournament_name LIKE '%foo%'
  ORDER
     BY t.tournamentId
      , r.playerId

出现在表名之后的tr是表别名,我们可以通过在列名前面加上表别名和一个点来限定对每个表中列的引用.这使得列引用明确。 (在tournamentId 的情况下,MySQL 不知道您指的是t 还是r 中的列,因此我们对其进行限定以使其明确。我们对all 列引用。然后,阅读该语句的人不需要怀疑哪个表包含列playerId

【讨论】:

  • LEFT 参数或子句有什么作用?
  • LEFT JOIN 指定了一个外连接操作。它表示我们要返回 left 侧 (t) 表中的 所有 行,以及 右侧表中的任何匹配行 侧 (r)。如果r 中没有匹配的行,则返回t(左侧)中的行,但使用NULL 值代替r 中的列。如果从t 返回的每一行在r 中至少有一个匹配行,则结果与inner join 相同。我们只会看到 r 中“缺失”行的差异。
【解决方案2】:

您的查询可能是这样的

SELECT a.*, b.tournamnetName FROM table_tournament_results a 
left join table_tournaments on a.tournamentId=b.tournamentId
WHERE b.tournamnetName LIKE "%Query%"

【讨论】:

  • WHERE 子句中的谓词有效地否定了 LEFT JOIN 的“外部性”。 (条件测试向我们保证,tournamentName 的任何行都不会返回 NULL 值,因此由“外连接”创建的 b 中的任何 NULL 值行都将被丢弃,这相当于内连接。
猜你喜欢
  • 1970-01-01
  • 2013-05-06
  • 2016-07-20
  • 2015-11-05
  • 2014-02-15
  • 2013-06-16
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多