Mysql-物品表的异常检测语句

本文介绍两种SQL查询方法,一种利用GROUP BY与HAVING子句筛选出拥有两件以上相同物品的玩家;另一种通过联表查询找出能叠加超过两次的物品及其拥有者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.表的结构如下

CREATE TABLE `t_player_item` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `player_id` int(11) NOT NULL COMMENT '玩家id',
  `uid` varchar(60) NOT NULL COMMENT '唯一id',
  `item_code` int(11) NOT NULL DEFAULT '0' COMMENT '物品code',
  `item_amount` int(11) NOT NULL DEFAULT '0' COMMENT '数量', 
  `pos_type` int(11) NOT NULL DEFAULT '0',
  `js_str` varchar(3000) NOT NULL DEFAULT '' COMMENT 'js格式字符串',
  `create_dt` datetime NOT NULL DEFAULT '2011-01-01 00:00:00' COMMENT '建创时间',
  PRIMARY KEY (`id`),
  KEY `idx_player_id` (`player_id`) USING BTREE,
  KEY `idx_player_item_uid` (`uid`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12434376 DEFAULT CHARSET=utf8 COMMENT='玩家物品';

需要从中找到拥有两件相同物品且 pos_type均 为1的玩家


使用group by 和 having的结合

sql语句:

SELECT DISTINCT(player_id) FROM t_player_item WHERE pos_type=1 
GROUP BY player_id 
HAVING COUNT(item_code)!=COUNT(DISTINCT item_code); 


使用联合查找

SELECT
username,
b.item_code,
c.overlay,
count(b.player_id) AS num
FROM
t_player AS a,
t_player_item AS b,
fanren_sy_config.t_item AS c
WHERE
a.player_id = b.player_id
AND b.pos_type = 1
AND b.item_code = c.`code`
AND c.overlay > 1
GROUP BY
b.player_id,
b.item_code
HAVING
num > 2;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值