我有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
。
答案 0 :(得分:2)
使用union all
和limit
:
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;
事实上,拥有多个具有基本相同结构的表通常是个坏主意。您应该考虑通过将这三个表合并到一个表中来重构表,其中包含一个包含评级的列。