Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 连接4个表和foreach循环的SQL语句_Php_Mysql_Sql_Arrays - Fatal编程技术网

Php 连接4个表和foreach循环的SQL语句

Php 连接4个表和foreach循环的SQL语句,php,mysql,sql,arrays,Php,Mysql,Sql,Arrays,你好,来自保加利亚,这是我在这里的第一篇帖子,如果我没有很好地解释一切,请原谅 我在网站(PHP,MYSQL)上做在线语言课程的管理面板。 我必须看到: 包含网站中注册的所有用户的列表 如果支付或未支付其中一门课程的费用(至少4门课程) (妈妈) 如果他们已经为任何课程输入促销代码 表名和重要表列的名称为: 用户:用户id、电子邮件、真实姓名 付费课程:付费课程id、付费课程名称 用户付费外部参照:外部参照标识、用户标识、付费课程标识 凭证:凭证id、用户id、凭证、付费课程id 我认为最终的结

你好,来自保加利亚,这是我在这里的第一篇帖子,如果我没有很好地解释一切,请原谅

我在网站(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"
        }
         }
    
         }
    
  • [1]=>是用户id的密钥
  • 在数组中,有两个额外的数组,其长度等于付费课程的数量(例如,在Moment只有4个付费课程-英语、西班牙语等)
  • [“付费课程id”][1]=>这里的键[1]是付费课程表中的付费课程id
  • [“付费课程id”][2]=>字符串(1)“1”-这里的值“1”是:如果表中有一行用户付费课程外部参照,当前付费课程id(示例中付费课程id=2)的值为1,如果没有行,则值为0(换言之,用户已支付本课程费用或未支付本课程费用)
  • [“凭证”][3]=>字符串(19)“凭证-BBBBBBBBBBB”-此处与数组元素键的付费课程id相同
  • [“凭证”][3]=>字符串(19)“凭证-bbbbbbb”-此处的值来自表凭证列的名称-凭证
  • 就这样,我希望有人能理解。
    提前感谢

    您可以使用左连接来获取多张凭证和多个课程

    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;
    }