从 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】:

如果我的交叉表假设是正确的,那么最好将最终结果组装成代码。在这种情况下,您可能不太可能需要多个查询;明显的JOINs 和有用的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 的使用的主要内容,如果未能解决你的问题,请参考以下文章

什么是非规范化 mysql 数据库的好方法?

sql 查询连接多个表 - 太慢(8 个表)

使用 MS Access Union Query 合并 3 个表/查询

MySQL - 当一个表可能没有对应的行时,如何在查询中组合 2 个表

如何优化这个 MySql 查询 - 连接 3 个表?

将 MySQL 查询减少到一个查询以加快速度