3

我在使用 MySQLIFCASE语法时遇到问题

程序是这样的:

我有一个调用 MySQL 查询的 PHP 项目,假设 PHP 通过 variable X

如果X不是0,那么它应该执行如下查询:

SELECT * FROM table
WHERE id = X

但如果X0。那么它应该执行一个查询来选择所有记录:

SELECT * FROM table

我不想让 PHP 中的条件根据 PHP 中的条件结果调用不同的 MySQL 查询。我希望根据传递的变量在 SQL 查询中执行 if/else 条件X

4

2 回答 2

3
SELECT * FROM table
WHERE $x = 0 or id = $x
于 2013-10-16T10:02:01.237 回答
1

我假设$x是从你的 PHP 派生的,那么:

SELECT * FROM t WHERE IF($x=0, 1, id=$x)

(这是为了展示总体思路,您必须自己处理注射等)

编辑

我在这里的另一个答案中找到了不错的代码。所以我很好奇——哪个更快?现在我很高兴我的也是这样:

我的版本:

mysql> 选择@@版本;
+-----------+
| @@版本 |
+-----------+
| 5.5.27 |
+-----------+
一组中的 1 行(0.00 秒)

现在,测试数据:

mysql> 从测试中选择 *;
+----+-------+
| 编号 | 标题 |
+----+-------+
| 1 | f |
| 3 | 吨 |
| 4 | 小号 |
+----+-------+
3 行一组(0.02 秒)

和测试:

第一:IF比较

mysql>选择@x;
+------+
| @x |
+------+
| 吨 |
+------+
一组中的 1 行(0.00 秒)

mysql> select benchmark(1E7, if(@x=0, 1, title=@x)) from test;
+----------------------------------------------------+
| 基准(1E7,如果(@x=0,1,标题=@x))|
+----------------------------------------------------+
| 0 |
| 0 |
| 0 |
+----------------------------------------------------+
3 行一组(1.66 秒)

mysql> 设置@x=0;
查询正常,0 行受影响(0.00 秒)

mysql> select benchmark(1E7, if(@x=0, 1, title=@x)) from test;
+----------------------------------------------------+
| 基准(1E7,如果(@x=0,1,标题=@x))|
+----------------------------------------------------+
| 0 |
| 0 |
| 0 |
+----------------------------------------------------+
3 行一组(1.85 秒)

二、OR比较

mysql>选择@x;
+------+
| @x |
+------+
| 0 |
+------+
一组中的 1 行(0.00 秒)

mysql> 从测试中选择基准(1E7,标题 = @X 或 @X = 0);
+----------------------------------------+
| 基准(1E7,标题 = @X 或 @X = 0)|
+----------------------------------------+
| 0 |
| 0 |
| 0 |
+----------------------------------------+
3 行,65535 个警告(17.31 秒)

-好的,那是因为类型转换。定影:

mysql> 设置@x='0';
查询正常,0 行受影响(0.00 秒)

mysql> 从测试中选择基准(1E7,标题 = @X 或 @X = '0');
+--------------------------------------------------------+
| 基准(1E7,标题 = @X 或 @X = '0')|
+--------------------------------------------------------+
| 0 |
| 0 |
| 0 |
+--------------------------------------------------------+
一组 3 行(5.78 秒)

最后,非零:

mysql> 设置@x='t';
查询正常,0 行受影响(0.00 秒)

mysql> 从测试中选择基准(1E7,标题 = @X 或 @X = '0');
+--------------------------------------------------------+
| 基准(1E7,标题 = @X 或 @X = '0')|
+--------------------------------------------------------+
| 0 |
| 0 |
| 0 |
+--------------------------------------------------------+
3 行一组(4.92 秒)

结论

IF在这种情况下,比较似乎比OR(1E7 基准迭代大约 3 倍)快得多

于 2013-10-16T10:04:31.387 回答