mysql子查询的结果错误(省略在哪里)

时间:2013-01-09 14:58:01

标签: mysql correlated-subquery

我得到这样的查询:

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会产生错误结果?

0 个答案:

没有答案