php - mysql wildcard (%) 在不使用通配符时给出不同的结果

标签 php mysql

我有一个 PHP 脚本,它根据您在下拉框中的选择生成报告。第一个选项是“全部”。如果我选择“全部”选项,我会得到与选择特定选项不同的结果。都是一样的sql语句,唯一的区别是:

and service_name like 'enf%'
and service_name like '%%'

第一个给了我 16 个结果(以“enf”开头),但第二个只给了我 13 个以“enf”开头的结果。这毫无意义!

完整的陈述(作为回应)是:

select service_name,order_section from transcription_result where flags='Exported' and exported between '20180801000000' and '20180831235959' and service_name like 'enf%' group by order_section order by service_name, order_section ASC

select service_name,order_section from transcription_result where flags='Exported' and exported between '20180801000000' and '20180831235959' and service_name like '%%' group by order_section order by service_name, order_section ASC

我试过...

and service_name like '%%'

...从第二个陈述中得出同样的错误结果。

数据库服务器版本为 10.1.25-MariaDB - 源码分发 Apache/2.4.26 (Unix) OpenSSL/1.0.2l PHP/5.6.31 mod_perl/2.0.8-dev Perl/v5.16.3 PHP版本:5.6.31 phpmyadmin 版本信息:4.7.0,最新稳定版:4.8.3 Ubuntu 16.04.4 LTS

表的架构:

`id` int(11) NOT NULL,
`session_id` varchar(100) NOT NULL,
`caller_id` varchar(20) DEFAULT NULL,
`service_name` varchar(20) NOT NULL,
`order_section` varchar(100) NOT NULL,
`variable_name` varchar(50) NOT NULL,
`variable_value` longtext NOT NULL,
`flags` varchar(50) NOT NULL COMMENT 'E- empty, R- Review',
`exported` timestamp NULL DEFAULT NULL,
`transcribed` timestamp NULL DEFAULT NULL,
`session_tbl_id` int(11) DEFAULT NULL,
`transcribed_by` varchar(50) NOT NULL,
`time_taken` int(3) NOT NULL COMMENT 'in seconds',
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

解决方案

我将语句更改为:

select distinct(order_section), service_name from transcription_result where flags='Exported' and exported between '20180801000000' and '20180831235959' and service_name like '%%' order by service_name, order_section ASC

最佳答案

这是基于给定模式的问题的最小复制:

INSERT INTO transcription_result
            (flags,
             exported,
             service_name,
             order_section)
VALUES      ('Exported',
             '20180805',
             'zzz12345',
             'one');

INSERT INTO transcription_result
            (flags,
             exported,
             service_name,
             order_section)
VALUES      ('Exported',
             '20180805',
             'enf12345',
             'one');

INSERT INTO transcription_result
            (flags,
             exported,
             service_name,
             order_section)
VALUES      ('Exported',
             '20180805',
             'enf12345',
             'two');

INSERT INTO transcription_result
            (flags,
             exported,
             service_name,
             order_section)
VALUES      ('Exported',
             '20180805',
             'zzz12345',
             'two');  


SELECT service_name,
       order_section
FROM   transcription_result
WHERE  flags = 'Exported'
       AND exported BETWEEN '20180801000000' AND '20180831235959'
       AND service_name LIKE 'enf%'
GROUP  BY order_section
ORDER  BY service_name,
          order_section ASC;  

+--------------+---------------+
| service_name | order_section |
+--------------+---------------+
| enf12345     | one           |
| enf12345     | two           |
+--------------+---------------+
2 rows in set (0.01 sec)

SELECT service_name,
       order_section
FROM   transcription_result
WHERE  flags = 'Exported'
       AND exported BETWEEN '20180801000000' AND '20180831235959'
       AND service_name LIKE '%%'
GROUP  BY order_section
ORDER  BY service_name,
          order_section ASC;  
+--------------+---------------+
| service_name | order_section |
+--------------+---------------+
| enf12345     | two           |
| zzz12345     | one           |
+--------------+---------------+
2 rows in set (0.00 sec)

我希望这能说明问题,并表明 group by 是根本问题 - 因为 service_name 不是由查询确定的。许多类型的 SQL 都拒绝这些查询,但 MySQL 允许它们运行,这既方便又有时令人困惑。

使用像 MAX(service_name) 这样的聚合函数可以解决不确定的查询问题。

关于php - mysql wildcard (%) 在不使用通配符时给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52180724/

相关文章:

php - 将使用路径更新列的触发器

php - argparse 像 PHP 的 lib?

php - BDD 测试有太多后台作业?

mysql - 使用mysql在表的最后一行显示总和

php - foreach 循环将数据库中的多个单选按钮填充到 php 字符串中

php - 获取空 JSON 响应

php - 如何将此sql查询写入laravel eloquent?

php - 将 HTML 页面保存到 MySQL 数据库,然后将代码插入该 HTML 并再次提供服务

php - 使用 php/mysql 创建数据网格 - 联合查询?

mysql - SQL,缺少结尾,但为什么?