zoukankan      html  css  js  c++  java
  • 查询出所有首笔订单金额超过1000的会员卡号及其首笔订单金额

    题目源自:http://www.cnblogs.com/xpivot/p/4143069.html#!comments

    有一张ER图描述数据结构,简单文字描述如下,劳烦看官各种脑补主外键关系:

    一张会员表(account),字段有会员id(account_id), 会员卡号(account_num)。。。

    一张交易订单表(trans),字段有会员id(account_id),交易时间(trans_time),交易金额(sales)。。。

    要求查询出所有首笔订单金额超过1000的会员卡号及其首笔订单金额,

    注:

    1. 首笔订单指的是每个会员交易时间最小的一笔订单

    2. 会员表有一千万笔记录

    3. 如果会员没有任何订单或者首笔订单金额不足1000,则首笔订单金额返回0。

    根据题目描述,建表

    account表如下:

    语句如下:

    /*
    Navicat MySQL Data Transfer
    
    Source Server         : localhost
    Source Server Version : 50614
    Source Host           : localhost:3306
    Source Database       : amydb
    
    Target Server Type    : MYSQL
    Target Server Version : 50614
    File Encoding         : 65001
    
    Date: 2014-12-04 19:23:39
    */
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for `account`
    -- ----------------------------
    DROP TABLE IF EXISTS `account`;
    CREATE TABLE `account` (
      `keyID` int(4) NOT NULL AUTO_INCREMENT,
      `account_id` varchar(50) NOT NULL,
      `account_card` varchar(50) NOT NULL,
      PRIMARY KEY (`keyID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of account
    -- ----------------------------
    INSERT INTO `account` VALUES ('1', 'tianxue', '1251859009@qq.com');
    INSERT INTO `account` VALUES ('2', 'xiaohua', '2804163771@qq.com');
    View Code

    trans表如下:

    语句如下:

    /*
    Navicat MySQL Data Transfer
    
    Source Server         : localhost
    Source Server Version : 50614
    Source Host           : localhost:3306
    Source Database       : amydb
    
    Target Server Type    : MYSQL
    Target Server Version : 50614
    File Encoding         : 65001
    
    Date: 2014-12-04 19:23:46
    */
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for `trans`
    -- ----------------------------
    DROP TABLE IF EXISTS `trans`;
    CREATE TABLE `trans` (
      `keyID` int(4) NOT NULL AUTO_INCREMENT,
      `account_id` varchar(50) NOT NULL,
      `trans_time` datetime NOT NULL,
      `sales` int(8) NOT NULL,
      PRIMARY KEY (`keyID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of trans
    -- ----------------------------
    INSERT INTO `trans` VALUES ('1', 'tianxue', '2014-12-22 18:38:20', '100');
    INSERT INTO `trans` VALUES ('2', 'xiaohua', '2014-12-08 18:38:38', '200');
    INSERT INTO `trans` VALUES ('3', 'tianxue', '2014-11-12 18:38:51', '2000');
    INSERT INTO `trans` VALUES ('4', 'xiaohua', '2014-12-31 18:39:07', '2000');
    View Code

    根据题目条件只有结果应该为:

    下面是我的查询语句,结果是对的,只是没有考虑效率。

    SELECT account.account_id, account.account_card, coalesce(c.sales,0) sales
    FROM account LEFT JOIN
            (
            SELECT a.account_id, a.sales
            FROM  trans AS a INNER JOIN
                (SELECT account_id, min(trans_time) AS firstTime
                FROM trans
                GROUP BY account_id) AS b
                ON a.account_id=b.account_id  
                WHERE a.sales > 1000 AND a.trans_time = b.firstTime) AS c
    on account.account_id = c.account_id
    Mysql的性能分析如下:

    coalesce这个是什么?刚从网上找的。返回传入的参数中第一个非null的值
    如:
    SELECT COALESCE(NULL, NULL, 1); 
    -- Return 1 

    有没有更高效的呢?

    作者:BestNow
    出处:http://www.cnblogs.com/BestNow/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    所有选择器
    display:block、display:inline与displayinline:block的概念和区别
    jQuery 选择器
    JS日历制作获取时间
    HTML DOM 事件
    访问HTML元素(节点)
    HTML常用标签
    flask+mysql的Docker 部署
    docker(三)
    flask如何部署
  • 原文地址:https://www.cnblogs.com/tianxue/p/4143680.html
Copyright © 2011-2022 走看看