【问题标题】:Query to fetch 1 row in table, and many rows from another table, referenced in that row查询以获取表中的 1 行,以及该行中引用的另一个表中的许多行
【发布时间】:2011-10-21 16:32:52
【问题描述】:

所以我的数据库中有 2 个表,它们是“锻炼”和“锻炼”。锻炼包含一个名为练习的行,它是以逗号分隔的练习 ID 列表 - 来自“练习”表,例如'1,2,3'。

我的问题是,我是否可以编写一个查询来允许我从锻炼表中选择一行,比如一个 id 为 1 的行,并让 MySQL 从该行的列表中获取每个练习,然后返回它们在“锻炼”行内?

目前我正在使用 PHP 选择锻炼行,然后对每个锻炼提出单独的请求,导致效率严重低下。

我查看了Joining rows as array from another table for each row 并对 group_concat() 函数进行了一些研究,但我不确定这就是我所追求的。

更新 下面是两张表:

【问题讨论】:

  • 重新设计您的架构以拥有一个名为exercises_workouts(或类似名称)的交叉引用表。放弃 CSV 字段。这与数据库应该帮助您解决的问题背道而驰。
  • 那么有一个只有“workoutid”和“exerciseid”字段的表格,然后从那里开始?
  • 对,这是有道理的,如果您将其发布为我会接受的答案。

标签: php mysql relational-database left-join inner-join


【解决方案1】:

IMO,最好的方法是重新设计您的架构以拥有一个名为 exercises_workouts(或类似名称)的交叉引用表。删除 CSV 字段。

以下页面详细介绍了实现多对多关系:

http://www.tonymarston.net/php-mysql/many-to-many.html

注意:链接页面使用 mysql_* 函数,但该方法的一般解释仍然存在。您需要查看 PDO 以获取数据库访问权限。

【讨论】:

  • 刚刚为我的数据库绘制了 ERD,它有点显示我以前的解决方案是多么愚蠢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多