MYSQL SELECT语句最后一个日期如果Trace = 12

时间:2015-05-14 03:06:29

标签: php mysql

CREATE TABLE IF NOT EXISTS `sporesfungi` (
  `IDSpore` varchar(4) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  `Name` varchar(25) NOT NULL,
  `Type` varchar(10) NOT NULL,
  PRIMARY KEY (`IDSpore`),
  KEY `IDSpore` (`IDSpore`)
)

 CREATE TABLE IF NOT EXISTS `sporecount` (
  `IDSpore` varchar(4) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  `TraceNum` int(2) NOT NULL,
  `TraceHour` int(4) NOT NULL,
  `Amount` int(11) NOT NULL,
  `Date` date NOT NULL,
  UNIQUE KEY `IDSpore_2` (`IDSpore`,`TraceHour`,`Date`),
  KEY `IDSpore` (`IDSpore`)
)

由于我无法发布图片,因此我尝试做的就是从Typesporesfungi& {}获取Amount。来自IDSpore的{​​{1}}并进行内部联接,但是来自sporecount我只想要最新的日期数据,其中sporecount = 12这是它将具有的最高值。

所以我想要TraceNum达到12的最近日期的所有数据。

这是我尝试过但没有结果

TraceNum

这是我目前在桌面上进行测试的内容。

SELECT Amount, IDSpore, sporesfungi.Type FROM sporecount
    INNER JOIN sporesfungi ON sporecount.IDSpore = sporesfungi.IDSpore AS a
    WHERE Date = (
        SELECT MAX(Date)
            FROM sporecount AS b
            WHERE a.IDSpore = b.IDSpore)
    IF(MAX(b.TraceNum) = 12, 1, 0) =1

我希望我很清楚,欢迎任何建议。

2 个答案:

答案 0 :(得分:1)

构建此查询有两个步骤。首先,我们需要找到孢子达到tracenum为12的最后日期。由于您说它每天只能达到12次,我们会忽略tracehour

select idspore, max(`date`)
  from sporecount
  where tracenum = 12
  group by idspore

然后我们需要加入查询的结果,从sporesfungi表中获取数据。

select sf.*, sc.amount
  from sporesfungi sf
    inner join sporecount sc
      on sf.idspore = sc.idspore
    inner join (
      select idspore, max(`date`) d
        from sporecount
        where tracenum = 12
        group by idspore
    ) q
    on sc.date = q.d
      and sc.idspore = q.idspore
  where sc.tracenum = 12  ;           -- we do this check again because the 

子查询连接将导致多行。

demo here

更新后

从评论中看来,我们似乎处于不同的波长。你似乎想要的是找到任何孢子击中12的tracenum的最后日期,然后返回当天所有孢子的所有数据。这实际上简化了事情。

select sf.*, sc.*
  from sporesfungi sf
    inner join sporecount sc
      on sf.idspore = sc.idspore
    inner join (
      select max(`date`) d
        from sporecount
        where tracenum = 12
    ) q
    on sc.date = q.d;

Updated Fiddle

答案 1 :(得分:0)

尝试这样的事情

SELECT sc.Amount, sc.IDSpore, sf.Type
FROM sporecount sc INNER JOIN
  (SELECT IDSpore, MAX(Date) AS last_date 
    FROM sporecount 
   WHERE TraceNum= 12
   GROUP BY IDSpore
  ) last_sc
ON last_sc.IDSpore=sc.IDSpore 
  AND last_sc.last_date = sc.Date
INNER JOIN sporefungi sf
ON sf.IDSpore = sc.IDSpore