0

你好,来自保加利亚,这是我在这里的第一篇文章,如果我不能很好地解释一切,请原谅。

我正在为在线语言课程做网站(PHP、MYSQL)的管理面板。我必须看到:

  1. 包含在网站上注册的所有用户的列表
  2. 如果他们支付或不支付其中一门课程(目前是 4 门课程)
  3. 如果他们已经为任何课程输入了促销代码。

表名和重要表列的名称是:

  1. 用户: user_id、email、real_name
  2. PAID_COURSES: paid_course_id、paid_course_name
  3. USER_PAID_XREF: xref_id、user_id、paid_course_id
  4. VOUCHERS: voucher_id、user_id、voucher、paid_course_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. [1] => 是 user_id 的键
  2. 在数组中有 2 个额外的数组,其长度是付费课程的数量(目前的示例只有 4 个付费课程 - 英语、西班牙语......等)
  3. ["paid_course_id"][1] => 这里的键 [1] 是paid_courses表中的paid_course_id
  4. ["paid_course_id"][2]=> string(1) "1" - 这里的值 "1" 是:如果表user_paid_xref中有一行当前的paid_course_id(在示例中是paid_course_id=2)是有值的1如果没有一行,则值为0(换句话说,用户已支付此课程费用或用户未支付此课程费用)
  5. ["voucher"] [3] => string(19) "VOUCHER-BBBBBBBBBBB" - 此处与数组元素键的paid_course_id 相同。
  6. ["voucher"][3]=> string(19) " VOUCHER-BBBBBBBBBBB " - 这里的值来自表VOUCHERS列的名称 -凭证

就是这样,我希望有人能理解它。 提前致谢

4

2 回答 2

0
SELECT u.user_id, u.email, u.real_name,
       GROUP_CONCAT(CONCAT(upx.paid_course_id IS NOT NULL, '|' IFNULL(v.voucher, '0'))) course_vouchers
FROM `USERS` u
LEFT JOIN `USER_PAID_XREF` upx ON (u.user_id = upx.user_id)
LEFT JOIN `VOUCHERS` v ON (u.user_id = v.user_id AND upx.paid_course_id = v.paid_course_id)
GROUP BY u.user_id

这将为每个用户生成一行,其中包含逗号分隔的列表course_vouchers。此列表的元素是管道分隔的course_id标志和voucher.

我忽略PAID_COURSES了查询,因为您的结果似乎没有使用该表中的任何内容。

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_CONCAT是 1024 个字符。对于像你这样的数据,如果他们有所有课程的优惠券,那看起来大约有 40 门课程。如果用户可能有更多课程,您可能需要增加此限制。请参阅此问题以了解如何执行此操作。

于 2013-08-16T22:14:32.943 回答
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)
于 2013-08-16T21:47:42.937 回答