【问题标题】:If statement within a where clause utilizing varible to create variables使用变量创建变量的 where 子句中的 if 语句
【发布时间】:2014-04-11 12:37:25
【问题描述】:

我正在寻找一种方法来使用 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 子句中使用此信息。

我有一个用户需要将此信息用于数据库中的其他用户来确定匹配项。基本上每个用户都有一个列名 a,它有 100、1 或 0。我们将当前用户数据与从数据库中查询到的所有用户信息相加以确定匹配。

我很喜欢 MYSQL 和 php,我已经尝试了很多场景,但无法使其正常工作,欢迎任何帮助或最佳建议,并提前致谢。

更新表如下所示

用户1

   A    b   c  d
   100  1   0  1

用户2

   A    b   c  d
   100  1   1  1

我需要比较用户以查看他们是否根据上述标准匹配,即如果将类似的列相加并最终达到 101 或更高,则它们是匹配的。总共有 34 列。用户 1 是固定用户,除了用户 2 之外可能还有更多用户,用户 3、4 5 等等。

【问题讨论】:

  • 这个问题不清楚。同一个用户表中是否有 2 个用户“a”和“b”?什么是 1a 和 2a,用户 'a' 下的这两列是什么?请给我们一个示例架构,以便我们知道您正在使用什么。
  • 是的,有两个用户,1和2,列是a和b。
  • 好的,所以用户是 1 和 2。你说列 'a' 和 'b' 但在你的问题中你说'每个用户都有一个列名 "a"'。是一列还是两列?如果您应该使用表架构(SHOW CREATE TABLE 用户)并提供外部信息的清晰定义,那将非常有帮助。
  • 我添加了一些更新的表格数据,并希望对所需结果有所了解
  • 啊,这有点帮助。 c、d 是否相关?

标签: php mysql


【解决方案1】:

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

【讨论】:

  • 这太棒了!!!丹,谢谢,我不熟悉存储过程,但并不难弄清楚。所以我可以在 db 上运行它以获得正确的结果,我如何在 php 脚本中运行它来调用程序 datacmp? select 语句看起来很正常,但是如果调用 php 会理解 datacmp 是什么吗?再次感谢这看起来很完美。 bt,第二个是我在哪里寻找的。​​span>
  • 查询,就 PHP 而言,只是一个字符串。该函数(我将其定义为函数,而不是存储过程)必须由 PHP 用来连接数据库的用户定义和执行。函数和存储过程有一个古怪但漂亮的权限方案——如果你遇到问题,最好在堆栈溢出时发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 2014-02-16
  • 1970-01-01
  • 2023-03-02
相关资源
最近更新 更多