查询此问题的最佳方式是什么?
我有看起来像这样的表:
questions:
id description
1 Q1
2 Q2
answers:
id question_id x y description
1 1 1 2 A1
2 1 3 4 A2
3 2 5 6 A3
4 2 7 8 A4
我想要得到的是一个可以输出以下内容的查询:
Q1 A1 1,2 A2 3,4
Q2 A3 5,6 A4 7,8
我已经花了好几天的时间试图弄清楚这一点。我正在 PHP 和 MySQL 中完成此操作,因此如果有人可以提供一些线索,那就太好了。
编辑:我忘了提及我也使用 CodeIgniter 来实现此目的。所以,这可能有助于找到答案。
I have tables that look like this:
questions:
id description
1 Q1
2 Q2
answers:
id question_id x y description
1 1 1 2 A1
2 1 3 4 A2
3 2 5 6 A3
4 2 7 8 A4
What I want to get is a query that can output this:
Q1 A1 1,2 A2 3,4
Q2 A3 5,6 A4 7,8
I've been pulling my hair for days now trying to figure this out. I'm doing this in PHP and MySQL so if anyone can shed some light out there, that'd be really great.
EDIT: I forgot to mention that I'm using CodeIgniter for this, too. So, that might help with the answers.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
考虑到每个问题可能有随机数量的答案,您无法设计返回固定数量列的查询。您必须为每个问题返回一个结果,然后在代码中进行一些解析。
GROUP_CONCAT
函数对于解决此类问题很有帮助:将返回
您可以根据您想要在代码中解析结果的任何内容来更改
SEPARATOR
值。您可以使用GROUP_CONCAT
函数的ORDER BY
子句对每个答案的返回结果中的答案进行排序(这里我按答案 id 排序)。编辑:如果您确定每个问题的答案永远不会超过 4 个,您可以发出以下查询,将每个答案放入其自己的列中:
将返回
我添加了第二个问题的答案为了说明。
Considering that there might be a random number of answers per question, you cannot design a query that will return a fixed number of columns. You have to return a single result per question and then do a little bit of parsing in your code.
The
GROUP_CONCAT
function can be helpful for this kind of problem:Will return
You can change the
SEPARATOR
value by whatever you want to parse the result in your code. You can use theORDER BY
clause of theGROUP_CONCAT
function to order the answers in the returned result for each answer (here I ordered by answer id).Edit: If you are sure that there will never be more than 4 answers per question, you can issue the following query to put each answer in its own column:
Will return
I added an answer to the second question for the illustration.
从答案中选择 * ORDER BY Question_id
请注意,此代码仍然需要一些工作......它可以让您了解如何做到这一点。
select * from answers ORDER BY question_id
Note, this code still needs a bit of work ... its to give you an idea on how to do it.
此查询:
将显示:
您所描述的最终结果称为透视,这在 MySQL 中并不容易,并且取决于您拥有的数据。例如,如果一个问题有超过 2 个答案,应该显示什么?
为什么结果会是这样的:
而不是那样?:
无论如何,对于每个问题最多 4 个答案并按
answers.id
进行排序,这是可行的。最好使用前面的查询并在 PHP 中进行旋转,这样您就可以毫无问题地处理可变数量的列:This query:
will show:
What you describe as final result is called pivoting and it's not easy in MySQL and depends on the data you have. For example, what should be shown if for a question, there are more than 2 answers?
And why will the result be this:
and not like that?:
Anyway, for maximum of 4 answers per questions and ordering per
answers.id
, this will work. It may be best though to use the previous query and do the pivoting in PHP, where you can handle variable number of columns without problem: