如何从三个表中提取查询

时间:2015-09-17 09:25:37

标签: mysql sql

这是我的数据库(我只放了重要的cols)

类别(cid,cname)

记录类别

(1, A)
(2, B)
(3, C)

USERS(uid,uname,cid);

记录用户

(1, JON, 1)
(2, NED, 1)
(3, ROB, 2)
(4, JAM, 3)
(5, TYR, 1)
(6, CAT, 2)
(7, JOF, 2)
(8, SAN, 3)
(9, ARY, 1)

购买(pid,uid,价格)

记录采购

(1, 2, 100)
(2, 5, 150)
(3, 1, 300)
(4, 2, 120)
(5, 3, 50)
(6, 3, 210)
(7, 2, 190)
(8, 8, 155)
(9, 9, 111)
(10, 2, 100)
(11, 2, 150)
(12, 1, 310)
(13, 8, 120)
(14, 3, 50)
(15, 7, 210)
(16, 2, 190)
(17, 6, 155)
(18, 4, 111)

我想要一个决赛桌:

FINAL TABLE (cname, total)

总计是:SECOND.sid最多3个tnum组的值之和。

这些是您可以通过SELECT FROM表THIRD获得的每个SECOND行的3个最大值。

1 -> MAX(300, 310) = 310
2 -> MAX(100, 120, 190, 100, 150, 190) = 190
3 -> MAX(210, 50, 50) = 210
4 -> MAX(111) = 111
5 -> MAX(150) = 150
6 -> MAX(155) = 155
7 -> MAX(210) = 210
8 -> MAX(155, 120) = 155
9 -> MAX(111) = 111

A类用户1,2,5和9只有最多三个最大值将是和

total1(310) > total2(190) > total5(150) > total9(111).

所以

A -> total1(310) + total2(190) + total5(150) = 650

B类有3,6和7用户,所以这三个都是对的:

B -> total3(210) + total6(155) + total7(210) = 575

最后,类别C有用户4和8

C-> total4(111) + total8(155) = 266**

所以我做了这个子查询:

SELECT max(price) tot, u.uid user, p.pid purchase, u.cid category 
FROM purchase p, user u 
WHERE p.uid=u.uid group by user ORDER BY tot DESC LIMIT 3

限制3不起作用,因为打印前三个值。

这是总查询:

SELECT c.cname, sum(totalmax.tot) totalsum

FROM purchases p1, categories c1, users u1, 

(SELECT max(price) tot, u.uid user, p.pid purchase, u.cid category 
FROM purchase p, user u 
WHERE p.uid=u.uid group by user ORDER BY tot DESC LIMIT 3) totalmax

WHERE totalmax.pid = p1.pid AND u1.cid=c1.cid AND u1.uid=p1.uid

GROUP BY c1.cnome

ORDER BY totalsum DESC

我试图这样做(这就是我想要的想法):

AND u.cid = c1.cid

但是子查询没有读取f1.fid。 如何将c1.cid提供给子查询?

感谢您的回答

2 个答案:

答案 0 :(得分:1)

SELECT * INTO #values FROM
(SELECT sid, max(tnum) as val
FROM THIRD t
GROUP BY sid) v

SELECT f.fname, sum(val)
FROM
FIRST f
INNER JOIN SECOND s
ON f.fid= s.fid
INNER JOIN #values v
ON v.sid=s.sid
GROUP BY f.fname

DROP TABLE #values

答案 1 :(得分:1)

编辑完问题后,我编辑了这个答案。您正在寻找的查询并不是直截了当的,因为组中的"前N"你需要的选择。

这是我的快速尝试,肯定不是最佳的(建议欢迎)。

date