如果where子句中的语句利用变量来创建变量

时间:2014-03-08 06:03:51

标签: php mysql

我正在寻找一种利用

比较PHP中MYSQL数据库信息的方法

遵循逻辑:

IF 1a+2a=200, then ma=100

ElseIf 1a+2a=101, then ma=1

Elseif 1a+2a=2, then ma=1

else ma=0

IF 1b+2b=200, then mb=100

ElseIf 1b+2b=101, then mb=1

Elseif 1b+2b=2, then mb=1

else mb=0

然后取ma+mb > 100使其成为匹配

我希望在select语句的where子句中使用此信息。

我有一个用户需要对数据库中的其他用户使用此信息来确定匹配项。基本上每个用户都有一个列名,一个有100,1或0.我们使用数据库中所有查询的用户信息添加当前用户数据以确定匹配。

我正在使用MYSQL和php,我尝试了很多场景,但是不能让它工作,欢迎任何帮助或最好的建议,并提前感谢。

更新表看起来像这样

user1

   A    b   c  d
   100  1   0  1

user2

   A    b   c  d
   100  1   1  1

我需要比较用户,看看他们是否匹配基于上述标准,即如果列添加了列,最终达到101或更高,则匹配。共有34列。用户1将是常量用户,除了user2之外可能有更多用户,将有用户3,4,5等。

1 个答案:

答案 0 :(得分:0)

你在这里做的事情最终变得棘手,因为你要添加列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倍并包含函数的内容 - 为每个列名调整 - 而不是定义和调用函数。