今天去参加了一个面试,然后总共就4个题目,记录下,给大家一点启发。
1. 查询订单表(order)中,累计支付金额大于200的用户
| uid | amount |
|---|---|
| 1 | 10 |
| 2 | 10 |
sql
select sum(amount) as ct,uid from orders group by uid having ct > 2002. 查询一个表中的重叠数据。
| 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实现,找出找个重叠的两条数据。
- 利用自联结
- 出现重叠数据一条记录的开始时间落在的另外一条记录的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 ASC3. 实现一个函数,判断给定的字符串是不是合法?
```php
function isEmail(array $string): bool {
}
```
- 假设给定的字符串是一个字符数组
['a','b'....] - 不允许使用正则表达式
- 你只能使用以下三个函数
empty、foreach、array_shift - 假定给定的字符中只有小写字母[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();
上面的代码有啥问题?,如何解决?