Php 连接4个表和foreach循环的SQL语句
你好,来自保加利亚,这是我在这里的第一篇帖子,如果我没有很好地解释一切,请原谅 我在网站(PHP,MYSQL)上做在线语言课程的管理面板。 我必须看到:Php 连接4个表和foreach循环的SQL语句,php,mysql,sql,arrays,Php,Mysql,Sql,Arrays,你好,来自保加利亚,这是我在这里的第一篇帖子,如果我没有很好地解释一切,请原谅 我在网站(PHP,MYSQL)上做在线语言课程的管理面板。 我必须看到: 包含网站中注册的所有用户的列表 如果支付或未支付其中一门课程的费用(至少4门课程) (妈妈) 如果他们已经为任何课程输入促销代码 表名和重要表列的名称为: 用户:用户id、电子邮件、真实姓名 付费课程:付费课程id、付费课程名称 用户付费外部参照:外部参照标识、用户标识、付费课程标识 凭证:凭证id、用户id、凭证、付费课程id 我认为最终的结
array(2)
{
[1]=> array(5) {
["user_id"]=> string(1) "1",
["email"]=> string(15) "email@email.com",
["real_name"]=> string(5) "ANJEL" ,
["paid_course_id"]=> array(4) {
[1]=> string(1) "1"
[2]=> string(1) "0"
[3]=> string(1) "1"
[4]=> string(1) "0"
},
["voucher"]=> array(4) {
[1]=> string(20) "VOUCHER-11111111111"
[2]=> string(1) "0"
[3]=> string(19) "VOUCHER-AAAAAAAAAAA"
[4]=> string(1) "0"
}
}
[2]=> array(5) {
["user_id"]=> string(1) "2"
["email"]=> string(16) "office@email.com"
["real_name"]=> string(5) "MITKO"
["paid_course_id"]=> array(4) {
[1]=> string(1) "0"
[2]=> string(1) "1"
[3]=> string(1) "1"
[4]=> string(1) "0"
},
["voucher"]=> array(4) {
[1]=> string(1) "0"
[2]=> string(20) "VOUCHER-22222222222"
[3]=> string(19) "VOUCHER-BBBBBBBBBBB"
[4]=> string(1) "0"
}
}
}
提前感谢您可以使用左连接来获取多张凭证和多个课程
SELECT * FROM `USERS` u
LEFT JOIN `VOUCHERS` v ON (u.user_id = v.user_id)
LEFT JOIN `USER_PAID_XREF` upx ON (u.user_id = upx.user_id)
LEFT JOIN `PAID_COURSES` pc ON (upx.paid_course_id = pc.paid_course_id)
这将为每个用户生成一行,在课程\u凭证
中使用逗号分隔的列表。此列表的元素是管道分隔的课程\u id
标志和凭证
我将付费课程排除在查询之外,因为您的结果似乎没有使用该表中的任何内容
PHP将类似于:
$result = array();
while ($row = $stmt->fetch_assoc()) {
// Split apart the pieces of $row['course_vouchers']
$courses = array_map(function($x) { return explode('|', $x); },
explode(',', $row['course_vouchers']));
$row['paid_course_id'] = array_map(function($x) { return $x[0]; }, $courses);
$row['voucher'] = array_map(function($x) { return $x[1]; }, $courses);
unset($row['course_vouchers']);
$result[] = $row;
}
请注意,
GROUP\u CONCAT
的默认大小限制为1024个字符。对于像您这样的数据,如果他们有所有课程的凭单,则看起来大约有40个课程。如果用户可能有更多课程,您可能需要增加此限制。请参阅以了解如何执行此操作。是否要求有人为您编写查询?因为这不是这个网站的目的!欢迎访问。但是,我们不鼓励询问代码。你至少可以发布你迄今为止尝试过的内容。这将生成所有凭单和课程的完整叉积。诀窍是将这些内容组合到他想要的两个子数组中。感谢你的快速回答,但我希望每个用户都排成一行,因为se我应该能够通过一个链接激活他:想象一下:HTML电子邮件表中的1行,NAME,activate FOR ENGLISH,activate FOR FRENCH,是西班牙语支付的(没有链接),激活RUSSIAN@Barmar然后,他为每个用户运行了两个查询,以获取凭单和课程,我可以通过将课程分组为单行凭单来提供答案,GROUP\u-CONCAT
,但是GROUP\u-CONCAT
有字符串限制,首先他必须增加字符限制??@dianu对于这样的短字符串,这不太可能是个问题。
$result = array();
while ($row = $stmt->fetch_assoc()) {
// Split apart the pieces of $row['course_vouchers']
$courses = array_map(function($x) { return explode('|', $x); },
explode(',', $row['course_vouchers']));
$row['paid_course_id'] = array_map(function($x) { return $x[0]; }, $courses);
$row['voucher'] = array_map(function($x) { return $x[1]; }, $courses);
unset($row['course_vouchers']);
$result[] = $row;
}