从 6 个表构建一个 mysql 查询以减少 php 的使用
Posted
技术标签:
【中文标题】从 6 个表构建一个 mysql 查询以减少 php 的使用【英文标题】:Building a mysql query from 6 tables to reduce php usage 【发布时间】:2015-12-03 20:44:44 【问题描述】:首先,我不知道这是否是正确的交换。我一直在开发一个系统,用于向您周围的人请求分数从 1 到 5 的反馈,但是我在构建用于显示结果的查询时遇到了麻烦。另一个开发人员已经制作了表格,所以我必须处理这个。我有这个 mysql 数据库。
这些是简化的表格,所以你明白了。这些是静态的:
users
user_id || user_name || user_email
questions
question_id || theme_id || question
themes
theme_id || theme_title
这些是用户可以添加记录的地方。用户选择一个主题并向其他用户发送请求。
sentlists
list_id || created_by_user_id || theme_id
requests
request_id || to_user_id || sent_list_id || answered
responses
response_id || request_id || rating
我如何构建一个查询(如果可能的话),当给定一个 list_id 时,会产生如下结果:
user_name || question name 1 || question name 2 || question name 3 || question name 4
Michael || 2 || 3 || 1 || 4
在过去的几个小时里,我一直在为此烦恼,但我想不出一个好的解决方案。我可以回退到 php,但这会导致对一个结果进行多次查询。
【问题讨论】:
用户如何链接到问题?根据您在此处列出的内容,没有明显的主键/外键关系。此外,您是否想要一组列,一个用于用户提交的每个问题的列?如果是这样,您最好为每个用户的每个问题请求一行。否则,当一个用户有 2 个问题而另一个用户有 3 个问题时会发生什么? 你能展示一些示例数据吗?我没有关注什么是 主题 或它与 问题 的关系。 我猜主题是用于“问卷”、“测试”、“调查”的术语。此外,猜测所需的结果是列名 = 包含用户回答的问题和列内容? @Uueerdo 是对的。用户不能提交自己的问题,他们必须从主题中进行选择,在已发送列表中创建自己的记录,并且能够向其他用户发送请求。我会调整问题。 说了这么多,我认为问题是要求“跨标签”查询; MySQL 中最难做的事情之一,解决方案最终变得复杂、不灵活且维护成本高。 【参考方案1】:如果我的交叉表假设是正确的,那么最好将最终结果组装成代码。在这种情况下,您可能不太可能需要多个查询;明显的JOIN
s 和有用的ORDER BY
(例如ORDER BY user_name, question_name, answer
)应该使代码部分相对简单。
您不能在单个查询中改变结果字段。您可以使用代码来动态创建查询,但这通常会导致工作量过大。
【讨论】:
谢谢,这回答了我的问题。【参考方案2】:select * from sentilists as a
join users as b on a.created_by_user_id = b.user_id
join questions as c on a.theme_id = c.theme_id ..... and so on
我不确定主题和问题是如何相关的,所以也许你可以澄清一下,但我猜多连接会在你的情况下工作。
【讨论】:
我知道如何构建一个连接查询,但关键是 collums 的数量可以根据与列表关联的主题(和相应的请求)而变化以上是关于从 6 个表构建一个 mysql 查询以减少 php 的使用的主要内容,如果未能解决你的问题,请参考以下文章
使用 MS Access Union Query 合并 3 个表/查询