我有这张桌子:
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
答案 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。