今日面试题分享

今天去参加了一个面试,然后总共就4个题目,记录下,给大家一点启发。

1. 查询订单表(order)中,累计支付金额大于200的用户

uid amount
1 10
2 10

2. 查询一个表中的重叠数据。

id uid start end
1 1 2020-02-01 2020-03-01
2 1 2020-02-04 2020-04-03
3 2 2020-01-01 2020-02-01
4 2 2020-02-02 2020-05-01

解释: 在上述表中,uid=1的记录 在时间段上有重叠, id=1的记录和2020-02-01 - 2020-03-01 和 id = 2的记录 2020-02-04 - 2020-04-03
写一个sql实现,找出找个重叠的两条数据。

3. 实现一个函数,判断给定的字符串是不是合法?

```php
function isEmail(array $string): bool {

}
```
  1. 假设给定的字符串是一个字符数组 ['a','b'....]
  2. 不允许使用正则表达式
  3. 你只能使用以下三个函数 emptyforeacharray_shift
  4. 假定给定的字符中只有小写字母[a-z]@. 这三种字符
    正确的邮箱:test@test.com
    不是邮箱的字符:@..@@@a@test.cc.caac@..a

4. 防止超卖

商品表(goods)

  • good_id 商品id

  • num 库存

    good_id num
    1 1
      $dbh->beginTransaction();
      $dbh->execute("update goods set num = num -1 where goods_id =1")
      $dbh->commit();

    上面的代码有啥问题?,如何解决?

php
本作品采用《CC 协议》,转载必须注明作者和本文链接
闲云野鹤
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1
  1. SELECT DISTINCT uid FROM `order` GROUP BY uid HAVING SUM(amount) > 200;
  2. SELECT  
    origin.* 
    FROM
    `order` AS origin
    JOIN (
    SELECT DISTINCT
        o1.id,
        o1.uid,
        o2.`start`,
        o2.`end` 
    FROM
        `order` AS o1
        LEFT JOIN `order` AS o2 ON o1.uid = o2.uid 
    WHERE
        DATEDIFF( o1.`start`, o2.`start` ) > 0 
    AND DATEDIFF( o1.`start`, o2.`end` ) < 0 
    AND DATEDIFF( o1.`start`, o1.`end` ) < 0 ) AS temp
    WHERE origin.uid = temp.uid 
    AND DATEDIFF( origin.`start`, temp.`start` ) >= 0 
    AND DATEDIFF( origin.`start`, temp.`end` ) < 0;
  3. foreach循环中各种判断,代码拙劣粗暴就不放出来了
  4. 参考:博客:PHP 并发扣款,保证数据一致性(悲观锁和乐观锁)
4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!