我一直在尝试用一个join来解决这个问题。有可能吗?
表:
pkey | uid | A | B | C
100 | 1 | 5 | 2 |
101 | 1 | 5 | 3 | 'should find this'
102 | 1 | 4 | 6 |
103 | 2 | 5 | 2 | 'should find this'
104 | 3 | 2 | 7 |
105 | 3 | 1 | 1 |
106 | 3 | 2 | 1 | 'should find this'现在我需要选择带有pkey 101和103的记录。我使用这个查询来选择max(B)。
SELECT table.*
FROM (
SELECT uid, max(A) as maxA
FROM table
GROUP BY uid
) as maxlog
JOIN table
ON table.uid = maxlog.uid
AND table.A = maxlog.maxA它返回uid 1的两个记录(pkey 100和101)。如何在同一个查询中通过添加另一个联接对max(B)进行筛选?
发布于 2017-05-09 18:16:20
看起来您想要的是:对于每个uid,查找与A的MAX(A)值相关联的MAX(pkey)。
如果这是你想要的,试试这个:
SELECT table.*
FROM (
SELECT uid, A, MAX(pkey) as pkey
FROM table t
WHERE A = (SELECT MAX(A) FROM table WHERE uid = t.uid)
GROUP BY uid, A
) as maxlog
JOIN table
ON maxlog.pkey = table.pkey注意,虽然这在技术上只有一个JOIN,但这实际上只是语义--实际上,SELECT MAX(A)子查询实际上是一个JOIN (如果这样写的话,性能可能会更好)。
发布于 2017-05-09 18:17:32
您可以不使用GROUP BY,而可以使用子查询ORDER BY A DESC, pkey DESC和LIMIT对两个记录使用结果:
select t1.pkey, t1.uid, t1.A, t1.B, t1.C
from mytable t1
inner join (select pkey, a
from mytable
order by a desc, pkey desc
limit 2) t2
on t1.pkey = t2.pkey
;其结果是:
| pkey | uid | A | B | C |
|------|-----|---|---|------------------|
| 101 | 1 | 5 | 3 | should find this |
| 103 | 2 | 5 | 2 | should find this |Rextester 这里
https://dba.stackexchange.com/questions/173116
复制相似问题