您在这里所做的事情最终会变得很棘手,因为您要添加列 a、b、c、d,而不是定义真正的关系数据。您最终不得不一起考虑总和,循环,通常不会按照关系数据库中处理数据的方式处理数据,因为 a、b、c 和 d 都一起处理但被定义为单独的记录的字段,而不是正确相关表中的单独行。
尽管如此,我认为(我仍然不确定我是否理解你的目的)你正在做的事情可以通过这样的方式完成。
首先,主要是为了简单起见,我定义了一个函数来比较数字 a1 和 a2。 (这些不一定是a列,对于不同的用户只有2个相同的列) - 只是实现你的比较)
DELIMITER %
CREATE DEFINER=`root`@`localhost` FUNCTION `datacmp`( a1 INT, a2 INT ) RETURNS int(11)
DETERMINISTIC
return CASE a1 + a2 WHEN 200 then 100 when 101 then 1 when 2 then 1 else 0 end; %
DELIMITER ;
现在我们需要创建一个表来查询,其中包含一些数据。我只是随机插入了 a、b、c、d 值 0、1、100。
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`a` int(10) unsigned NOT NULL DEFAULT '0',
`b` int(10) unsigned NOT NULL DEFAULT '0',
`c` int(10) unsigned NOT NULL DEFAULT '0',
`d` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
);
INSERT INTO `users` VALUES
(1,0,0,0,1), (2,1,0,0,0), (3,100,1,0,0),
(4,0,100,100,100), (5,100,0,0,0), (6,1,0,0,0),
(7,100,0,0,0), (8,0,0,0,0), (9,1,0,100,0),
(10,100,0,0,1), (11,1,100,0,0), (12,0,0,0,0), (13,1,0,0,0),
(14,100,0,100,1), (15,0,100,0,100);
然后根据您对逻辑的描述,这样的查询可以做到:
select u1.id as u1, u2.id as u2,
datacmp( u1.a, u2.a ) as ma,
datacmp( u1.b, u2.b ) as mb,
datacmp( u1.c, u2.c) as mc,
datacmp( u1.d, u2.d) as md
from users u1 join users u2 on u1.id <> u2.id
having ma + mb + mc + md > 100;
+----+----+------+------+------+------+
| u1 | u2 | ma | mb | mc | md |
+----+----+------+------+------+------+
| 14 | 4 | 0 | 0 | 100 | 1 |
| 15 | 4 | 0 | 100 | 0 | 100 |
| 14 | 9 | 1 | 0 | 100 | 0 |
| 14 | 10 | 100 | 0 | 0 | 1 |
| 4 | 14 | 0 | 0 | 100 | 1 |
| 9 | 14 | 1 | 0 | 100 | 0 |
| 10 | 14 | 100 | 0 | 0 | 1 |
| 4 | 15 | 0 | 100 | 0 | 100 |
+----+----+------+------+------+------+
如果您想查找与给定用户匹配的用户,可以将其添加为 where。
select
u1.id as u1, u2.id as u2,
datacmp( u1.a, u2.a ) as ma,
datacmp( u1.b, u2.b ) as mb,
datacmp( u1.c, u2.c) as mc,
datacmp( u1.d, u2.d) as md
from users u1 join users u2 on u1.id <> u2.id
where u1.id = 14 having ma + mb + mc + md > 100;
+----+----+------+------+------+------+
| u1 | u2 | ma | mb | mc | md |
+----+----+------+------+------+------+
| 14 | 4 | 0 | 0 | 100 | 1 |
| 14 | 9 | 1 | 0 | 100 | 0 |
| 14 | 10 | 100 | 0 | 0 | 1 |
+----+----+------+------+------+------+
请注意,mysql 函数非常方便,但如果它们吓到您,您可以随时将查询延长 10 倍并包含函数的内容 - 针对每个列名进行调整 - 而不是定义和调用函数。