Skip to content

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

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

uidamount
110
210
sql
select sum(amount) as ct,uid from orders group by uid having ct > 200

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

iduidstartend
112020-02-012020-03-01
212020-02-042020-04-03
322020-01-012020-02-01
422020-02-022020-05-01

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

  • 利用自联结
  • 出现重叠数据一条记录的开始时间落在的另外一条记录的start和end之间
sql
SELECT
	a.uid,
	a.`start` AS a_start,
	b.`start` AS b_start,
	a.`end` AS a_end,
	b.`end` AS b_end
FROM
	log AS a
LEFT JOIN log AS b ON a.uid = b.uid
WHERE
	a.id <> b.id
AND (
	(a.`start` > b.`start` && a.`start` < b.`end`) or (b.`start` > a.`start` && b.`start` < a.end )
)
ORDER BY
	a.id ASC

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

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

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

4. 防止超卖 ​

商品表(goods)

  • good_id 商品id

  • num 库存 | good_id | num | | ------------ | ------------ | | 1 | 1 |

    php
    $dbh->beginTransaction();
    //加锁
    $dbh->execute("update goods set num = num -1 where goods_id =1")
    $dbh->commit();

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

基于 VitePress 构建 · 欢迎 Star 与 PR