如果目标是返回最近的评论标题为“手机”和“PC”,我会做这样的事情:
SELECT q.username
, MAX(q.pc_date) AS pc_date
, MAX(p.title) AS pc_title
, MAX(q.mobile_date) AS mobile_date
, MAX(r.title) AS mobile_title
FROM (SELECT t.username
, MAX(IF(t.via_mobile='false',t.review_date,NULL) AS pc_date
, MAX(IF(t.via_mobile='true',t.review_date,NULL) AS mobile_date
FROM tripadvisor t
WHERE t.username <> ''
AND t.via_mobile IN ('true','false')
GROUP
BY t.username
) q
LEFT
JOIN tripadvisor p
ON p.username = q.username
AND p.review_date = q.pc_date
AND p.via_mobile = 'false'
LEFT
JOIN tripadvisor r
ON r.username = q.username
AND r.review_date = q.mobile_date
AND r.via_mobile = 'true'
GROUP
BY q.username
如果用户只有“移动”评论并且没有“pc”评论,该查询将返回一行,但“pc”列的值为NULL。同样,查询将为只有“pc”评论的用户返回“移动”列的NULL值。
可以很容易地将查询更改为仅返回具有“移动”和“pc”评价的用户的行,使其更接近使用INNER JOIN的原始行。
如果目标是简单的,只是仅返回最近的评价......
SELECT r.username
, r.review_date
, MAX(r.title) AS title
, MAX(r.via_mobile) AS via_mobile
FROM (SELECT t.username
, MAX(t.review_date) AS max_review_date
FROM tripadvisor t
WHERE t.username <> ''
AND t.via_mobile IN ('true','false')
GROUP
BY t.username
) q
JOIN tripadvisor r
ON r.username = q.username
AND r.review_date = q.max_review_date
AND r.via_mobile IN ('true','false')
GROUP
BY r.username
, r.review_date
此查询的结果有些不确定时username
具有相同的(最近的多行)review_date
。这保证将返回一行,但title
和via_mobile
可能不在同一行。
参见http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what -see-a-very-simple-sql-query – Strawberry
'NiceHôtel'...荒谬的 – Strawberry