从3个表

时间:2015-06-02 16:00:49

标签: mysql sql

我有3张看起来像这样的表:

tbl_rating_yes
ID,     rater,   rated,   ratetype, mry_timestamp
1       1234     3456       3       '2015-06-01 23:01:00:000'
2       1234     7666       3       '2013-06-01 23:02:00:000'
3       5678     1234       3       '2013-06-01 23:14:00:000'
4       9085     4567       3       '2013-06-01 23:19:00:000'

tbl_rating_no
ID,     rater,   rated,   ratetype, mrn_timestamp
1       6679     1234       1       '2015-06-01 13:09:00:000'
2       1234     9900       1       '2015-06-01 13:10:00:000'
3       8891     1111       1       '2015-06-01 14:56:00:000'
4       0010     4545       1       '2015-06-01 15:06:00:000'

tbl_rating_maybe
ID,     rater,   rated,   ratetype, mrm_timestamp
1       5632     9000       2       '2013-06-01 11:00:59:000'
2       3421     8787       2       '2013-06-01 12:44:00:000'
3       0100     9887       2       '2013-06-01 16:04:00:000'
4       9085     1234       2       '2013-06-02 01:22:00:000'

我希望能够找到评估者9085所做的最后一次互动。

目前我有一个类似的查询:

SELECT GREATEST(IFNULL(`mrm_timestamp`,'1900-01-01 01:01:01'),
                IFNULL(`mrn_timestamp`,'1900-01-01 01:01:01'),
                IFNULL(`mry_timestamp`,'1900-01-01 01:01:01')) as timestamp
FROM tbl_rating_no rn
LEFT JOIN tbl_rating_yes ry
ON ry.`rater` = rn.`rater`
LEFT JOIN tbl_rating_maybe rm
ON rm.`rater` = rn.`rater`
WHERE rn.rater = 9085
ORDER BY timestamp

但由于无评级表中不存在9085,因此不会带来结果。我希望能够至少带回时间戳,ratetype和id。不应该有冲突,但如果有最后时间带回所有结果。所以理想情况下,这应该从tbl_rating_maybe

中恢复信息

1 个答案:

答案 0 :(得分:2)

使用union alllimit

select r.*
from ((select r.*
       from tbl_rating_yes r
       where r.rater = 9085
       order by mry_timestamp desc
       limit 1
      )
      union all
      (select r.*
       from tbl_rating_no r
       where r.rater = 9085
       order by mrn_timestamp desc
       limit 1
      )
      union all
      (select r.*
       from tbl_rating_maybe r
       where r.rater = 9085
       order by mrm_timestamp desc
       limit 1
      )
     ) r
order by mry_timestamp desc
limit 1;

事实上,拥有多个具有基本相同结构的表通常是个坏主意。您应该考虑通过将这三个表合并到一个表中来重构表,其中包含一个包含评级的列。