Php where子句中的If语句使用Variable创建变量

Php where子句中的If语句使用Variable创建变量,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子句中使用此信息

我正在寻找一种方法,利用

以下逻辑:

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子句中使用此信息

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

我喜欢MYSQL和php,我已经尝试了很多场景,只是无法让它工作,欢迎任何帮助或最好的建议,并提前感谢

更新表如下所示

用户1

   A    b   c  d
   100  1   0  1
用户2

   A    b   c  d
   100  1   1  1

我需要比较用户,看看他们是否符合上述标准,也就是说,如果将like列相加,最终达到101或更高,他们就是一个匹配项。总共有34列。用户1将是固定用户,可能会有更多用户而不是用户2,还会有用户3、4、5等。

您在这里所做的工作会很棘手,因为您添加了列a、b、c、d,而不是定义真正的关系数据。你最终不得不考虑所有的总和,循环,一般不处理数据的方式,它是要处理的关系数据库,因为A,B,C和D都一起处理,但被定义为记录的单独字段,而不是在正确相关表中的单独行。 尽管如此,我认为(我仍然不确定我是否理解你的意图),你正在做的事情是可以做到的,就像这样

首先,主要是为了简单起见,我定义了一个函数来比较数字a1和a2。(这些不一定是a列,对于不同的用户,只有同一列中的2列)-仅实现比较)

现在我们需要创建一个要查询的表,其中包含一些数据。我只是随机插入了a,b,c,d值,或者0,1100

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 |
+----+----+------+------+------+------+
选择u1.id作为u1,选择u2.id作为u2,
数据CMP(u1.a,u2.a)作为ma,
数据CMP(u1.b,u2.b)为mb,
datacmp(u1.c,u2.c)作为mc,
数据CMP(u1.d,u2.d)作为md
从用户u1加入u1.id u2.id上的用户u2
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 |
+----+----+------+------+------+------+
选择
u1.id为u1,u2.id为u2,
数据CMP(u1.a,u2.a)作为ma,
数据CMP(u1.b,u2.b)为mb,
datacmp(u1.c,u2.c)作为mc,
数据CMP(u1.d,u2.d)作为md
从用户u1加入u1.id u2.id上的用户u2
其中,u1.id=14,且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倍,并包含函数内容(根据每个列名进行调整),而不是定义和调用函数。

这个问题不清楚。同一用户表中是否有两个用户“a”和“b”?什么是1a和2a,这两列是在用户“a”下吗?请给我们一个示例架构,以便我们知道您正在使用的是什么。是的,有两个用户,1和2,列是a和b。好的,所以用户是1和2。你说的是“a”列和“b”列,但在你的问题中你说的是“每个用户都有一个列名“a”。有一列还是两列?如果您应该使用表模式(显示创建表用户)并提供外部信息的清晰定义,这将非常有帮助。我添加了一些更新的表数据,并希望了解所需的结果,这会有所帮助。c,d是前卫的吗?这太棒了!!!Dan,谢谢,我对存储过程不太熟悉,但不难理解。所以我可以在db上运行它来获得正确的结果,我如何在php脚本中运行它来调用过程datacmp?select语句看起来很正常,但是如果调用,php会理解datacmp是什么吗?再次感谢这看起来很完美。bt,第二个是我用where寻找的。就PHP而言,查询只是一个字符串。函数(我将其定义为函数,而不是存储过程)必须由PHP用于连接数据库的用户定义和执行。函数和存储过程有一个古怪但巧妙的权限方案——如果遇到问题,最好在堆栈溢出时发布。
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 |
+----+----+------+------+------+------+