子查询引用FROM子句使用的外部表时的未知列

时间:2014-01-22 06:02:55

标签: mysql sql

我有这张桌子:

person table
| id | name    |
|  1 | person1 |
|  2 | person2 |

person_grade table

| id | person_id | grade  | grade_date |
|  1 |     1     | grade1 | 2010-01-01 |
|  2 |     1     | grade2 | 2012-01-01 |
|  3 |     2     | grade3 | 2010-05-05 |
|  4 |     2     | grade4 | 2012-03-03 |

我想知道特定时间的人员成绩,比如2012-02-02。怎么做到这一点?

我最接近的是这个查询:

SELECT t1.id, t1.name, 
(SELECT grade FROM (
(SELECT s1.grade, s1.grade_date FROM person_grade AS s1 
WHERE s1.grade_date >= '2012-02-01'  AND s1.person_id = t1.id
ORDER BY s1.grade_date LIMIT 1)
UNION ALL
(SELECT s1.grade, s1.grade_date FROM person_grade AS s1 
WHERE s1.grade_date <= '2012-02-01'  AND s1.person_id = t1.id
ORDER BY s1.grade_date DESC LIMIT 1)
) AS ss ORDER BY grade_date LIMIT 1) AS grade_person
FROM person AS t1

但在MySQL那给我一个错误

  

“'where子句'中的未知列't1.id'”。

请告知。
TIA

4 个答案:

答案 0 :(得分:1)

SELECT name,grade FROM person p
INNER JOIN person_grade pg
ON p.id=pg.person_id
WHERE pg.grade_date='2012-02-02'

答案 1 :(得分:0)

我不知道关于MySql的语法,但你可以做这样的事情

SELECT GRADE FROM person_grade WHERE DATE(GRADE_DATE,YEAR) = DATE(SEARCH_DATE,YEAR) AND DATE(GRADE_DATE,MONTH) = DATE(SEARCH_DATE,MONTH) AND DATE(GRADE_DATE,DAY) = DATE(SEARCH_DATE,DAY)

答案 2 :(得分:0)

SELECT p.name
     , pg.grade
FROM person p
     INNER JOIN person_grade pg ON p.id = pg.person_id
WHERE DATE(pg.grade_date) = '2012-02-02'

如果@ mhasan的回答不起作用,那么很可能是因为grade_date表的数据类型。如果它是DATETIME,那么它会存储日期的时间元素,这会使搜索该字段变得麻烦。

如果您不需要time元素,请尝试将列的数据类型更改为DATE。它应该使用更少的空间并使搜索更容易。

编辑:等等,我刚刚再次阅读了这个问题...你不想要日期与查询匹配的记录,你想要一些稍微复杂的东西。让我想一想......

答案 3 :(得分:0)

感谢大家的重播,我想我找到了解决方案,将子查询移到WHERE子句并在日期差异中使用MIN函数。这是查询:

SELECT p.id, p.name, pg.grade, pg.grade_date
FROM person AS p
LEFT JOIN person_grade AS pg ON p.id = pg.person_id
WHERE DATEDIFF ( '2012-02-02', pg.grade_date ) = 
  ( SELECT MIN ( DATEDIFF ( '2012-02-02', spg.grade_date ) )
  FROM person AS sp
  LEFT JOIN person_grade AS spg ON sp.id = spg.person_id
  WHERE DATEDIFF ( '2012-02-02', spg.grade_date ) > 0 AND sp.id = p.id )

结果:

| id |  name   | grade  | grade_date |
|  1 | person1 | grade2 | 2012-01-01 |
|  2 | person2 | grade3 | 2010-05-05 |

似乎对外部表的引用在FROM子句下不起作用,但在别处工作(至少在MySQL上)。

感谢其他问题的提示:Retrieve maximal / minimal record