Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何从三个表中提取查询_Mysql_Sql - Fatal编程技术网

Mysql 如何从三个表中提取查询

Mysql 如何从三个表中提取查询,mysql,sql,Mysql,Sql,这是我的数据库(我只放了重要的COL) 类别(cid、cname) 记录类别 (1, A) (2, B) (3, C) 用户(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)

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

类别(cid、cname)

记录类别

(1, A)
(2, B)
(3, C)
用户(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)
总计为:tnum组的最大3个值与SECOND.sid之和

这是第二行的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,因此最多只能有三个max之和

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

类别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
我试着这样做(这是我想要的想法):

但子查询未读取f1.fid。 如何为子查询提供c1.cid


谢谢你的回答

编辑完问题后,我编辑了这个答案。您要查找的查询不是直接的,因为您需要选择“组中的前N名”

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
这是我的快速尝试,当然不是最佳的(欢迎建议)


你真的在这里同时使用MySQL和SQLServer吗?我发现一些特定于产品的SQL不能在两种产品上运行…没有sqlserver。我在使用mysql时犯了一个错误。选择*是什么?我只在PLSql中使用它。你能在mysql中创建临时表吗?我在阅读sql server之后来到这里,首先编写了一个CTE,当你编辑标记时,我用子句.temp-table:
创建临时表tmp\u值选择…
临时表给了我一个错误。我尝试在内部联接中使用第一个。它像我一样工作。问题是子查询没有为每个查询获取前三个值。该查询提供了与我相同的屏幕。当然更好,因为我不擅长连接。问题是我希望在子查询中,每个t1.fid最多有三个max值。你明白吗?哦,对不起,我误解了你的问题。我可以编辑答案,但首先我需要更好地理解你想要实现的目标。您想从表三开始,考虑每一个SID的3个最高记录(TNUM),然后…我看到你是意大利人。如果你愿意,我可以用意大利语更好地解释你。然而,我希望max(tnum)是每个f.fid的三个max值中的一个。你明白吗?如果你能更好地解释情况的话,试着用意大利语写一篇评论,因为我还没有完全了解情况。
AND u.cid = c1.cid
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
select cname, sum(maxp) from(
    (select * from
        (select c.cname, p.uid, max(price) maxp from purchases p left join users u left join categories c on u.cid = c.cid on p.uid = u.uid group by p.uid) x
    where x.cname='A' order by maxp desc limit 3)

union all

    (select * from
        (select c.cname, p.uid, max(price) maxp from purchases p left join users u left join categories c on u.cid = c.cid on p.uid = u.uid group by p.uid) x
    where x.cname='B' order by maxp desc limit 3)

union all

    (select * from
        (select c.cname, p.uid, max(price) maxp from purchases p left join users u left join categories c on u.cid = c.cid on p.uid = u.uid group by p.uid) x
    where x.cname='C' order by maxp desc limit 3)
    ) y

group by cname order by cname