我有一个 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/