我得到这样的查询:
SELECT *
FROM
(
SELECT @rownum:=@rownum+people_counter AS row_number,
d.salary_base AS value,
location,
year_id
FROM data_jobs d, (SELECT @rownum:=0) r
WHERE location = 2
AND year_id = 3
AND salary_base IS NOT NULL
AND job_id IN ('45','46','47','48')
ORDER BY d.salary_base
) AS t1
但结果location=2
中省略了。为什么会这样?
完整的SQL看起来像:
SELECT t1.value+(t1.value-t3.minimum)/2 as up,
t1.value as m,
t1.value-(t1.value-t3.minimum)/2 as lq,
AVG(t4.av) AS av,
total
FROM
(
SELECT @rownum:=@rownum+people_counter as row_number,
d.salary_base as value
FROM data_jobs d, (SELECT @rownum:=0) r
WHERE year_id = 3
AND salary_base IS NOT NULL
AND location = 2
AND job_id IN ('45','46','47','48')
ORDER BY d.salary_base
) as t1,
(
SELECT sum(people_counter) as total
FROM data_jobs d
WHERE year_id = 3
AND salary_base IS NOT NULL
AND location = 2
AND job_id IN ('45','46','47','48')
) as t2,
(
SELECT MIN(salary_base) as minimum
FROM data_jobs d
WHERE year_id = 3
AND salary_base IS NOT NULL
AND location = 2
AND job_id IN ('45','46','47','48')
) as t3,
(
SELECT AVG(salary_base) as av
FROM data_jobs d
WHERE year_id = 3
AND salary_base IS NOT NULL
AND location = 5
AND job_id IN ('45','46','47','48')
) as t4
WHERE t1.row_number >= total*0.5 LIMIT 1
它从表格中给出了中位数,上四分位数,下四分位数,平均值和计数器。
有好的数据。该表目前有大约1万条记录。使用@rownum:=@rownum+people_counter AS row_number
会导致子查询WHERE出现问题。
job_id IN ('45','46','47','48')
工作正常,但location = 2 AND year_id = 3 AND salary_base IS NOT NULL
被sql完全忽略。
在这个例子中我应该有1个返回(因为我只有1个记录,其中location = 2)但是我得到了大约40个记录(错误的位置和year_id)。
表的结构:
CREATE TABLE IF NOT EXISTS `data_jobs` (
`id` int(1) unsigned NOT NULL AUTO_INCREMENT,
`company_id` int(1) unsigned NOT NULL,
`job_id` int(1) unsigned NOT NULL,
`grade_id` int(1) unsigned DEFAULT NULL,
`year_id` int(1) unsigned NOT NULL,
`new_name` varchar(256) NOT NULL,
`job_reference` varchar(256) NOT NULL,
`salary_base` float(8,2) DEFAULT NULL,
`salary_previous_base` float(8,2) DEFAULT NULL,
`bonus_percent_of_salary` float(5,2) DEFAULT NULL,
`bonus_actual` float(8,2) DEFAULT NULL,
`people_counter` int(1) unsigned DEFAULT NULL,
`location` int(1) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `job_id` (`job_id`),
KEY `year_id` (`year_id`),
KEY `company_id` (`company_id`),
KEY `location` (`location`),
KEY `grade_id` (`grade_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=11227 ;
经过几个小时的研究后,我发现问题是INDEX ON job_id。删除此索引后,一切正常。但请解释一下为什么job_id INDEX会产生错误结果?