我遇到了一个我遇到问题的查询。这是查询:
根据用户ID和月份,生成一个包含学生姓名的列表,他们拥有的文件列表(从大到小),包括文件总数和指定月份中使用的字节数。
这是我到目前为止所做的:
(Select * from htmp_cs368
Join roster_cs368 ON htmp_cs368.userId =
roster_cs368.lastName Where htmp_cs368.userId =
(SELECT lastName FROM roster_cs368 WHERE userId = 'userId' AND htmp_cs368.monthIn = 'monthIn'))
UNION
(Select * from atmp_cs368
JOIN roster_cs368 ON atmp_cs368.userId =
roster_cs368.userId Where roster_cs368.userId =
'userId' AND atmp_cs368.monthIn = 'monthIn') ORDER BY fileSize DESC;
我得到空集的结果。我的桌子已经满了。我希望somone可以纠正我的错误。
我已经包含了我的架构:
mysql> select * from roster_cs368
-> ;
+--------+-----------+-----------+
| userId | firstName | lastName |
+--------+-----------+-----------+
| apn7cf | Allen | Newton |
| atggg3 | andrew | goebel |
主键是userId
mysql> select * from htmp_cs368;
+------------+----------+------------+----------+----------+-------+------+-------+----------------------+
| filePerms | numLinks | userId | idGroup | fileSize | monthIn | day | time | fileName |
+------------+----------+------------+----------+----------+-------+------+-------+----------------------+
| drwx------ | 2 | schulte | faculty | 289 | Nov | 7 | 2011 | Java |
| -rw-r--r-- | 1 | schulte | faculty | 136 | Apr | 29 | 2012 | LD |
| drwxr-xr-x | 3 | schulte | faculty | 177 | Mar | 20 | 2012 | Upgrade |
这里没有主键
select * from atmp_cs368;
+------------+----------+--------------+----------+----------+-------+------+-------+-----------------------------+
| filePerms | numLinks | userId | idGroup | fileSize | monthIn | day | time | fileName |
+------------+----------+--------------+----------+----------+-------+------+-------+-----------------------------+
| drwxr-xr-x | 2 | remierm | 203 | 245 | Sep | 17 | 14:40 | 148360_sun_studio_12 |
| drwx---rwx | 31 | antognolij | sasl | 2315 | Oct | 24 | 12:28 | 275 |
| -rwx------ | 1 | kyzvdb | student | 36 | Sep | 19 | 13:05 | 275hh |
这里也没有主键。
我对mysql的经验很少。我还必须提出: 如果未指定用户标识,则所有文件(如果未指定月份),所有用户(如果未指定),则为所有月份和用户。 我陷入了困境中。我感谢任何帮助!谢谢!
答案 0 :(得分:1)
您似乎在SQL中遇到了许多问题。
第一
Join roster_cs368 ON htmp_cs368.userId = roster_cs368.lastName
您尝试将userId
字段加入lastName
字段,这肯定不起作用。两个表中应该是userId
。
然后
WHERE userId = 'userId' AND htmp_cs368.monthIn = 'monthIn'
假设这些文字真的是文字字符串,它们将不匹配表格中的任何内容。您需要使用参数化查询,并在SQL中替换问号,如
WHERE userId = ? AND htmp_cs368.monthIn = ?
并提供要在Java代码中使用的实际值。
我认为你正在寻找这些方面的东西(未经测试,但这会给你一个起点)
文件列表
select r.lastName, r.firstName, t.fileName, t.fileSize
from htmp_cs368 t join roster_cs368 r on t.userId=r.userId
where t.userId=? and t.monthIn=?
order by fileSize desc
要点:
select r.lastName, r.firstName, count(t.fileName), sum(t.fileSize)
from htmp_cs368 t join roster_cs368 r on t.userId=r.userId
where t.userId=? and t.monthIn=?
group by t.userId
这是一种简单的方法,它不考虑一个月内出现和消失的文件,但您的表中似乎没有数据。
此外,还不清楚atmp_cs368
的用途是什么,或者为什么一个表中的time
列似乎有year
值。
答案 1 :(得分:1)
正如其他人所指出的那样,你的SQL似乎有很多问题。我不认为它也可以编译。
尝试:
SELECT r.userId, files.*
FROM roster_cs368 AS r
JOIN (
Select * from htmp_cs368 WHERE userId = 'userId' AND monthIn = 'monthIn'
UNION
Select * from atmp_cs368 Where userId = 'userId' AND monthIn = 'monthIn'
) AS files ON files.userId = r.userId
ORDER BY files.fileSize DESC;
您只需要一个JOIN
。这会列出用户及其所有文件。并注意将苹果等同于苹果(userId!= lastName)。
现在要计算文件和文件大小等,您需要有效GroupBy
。但是,您无法“轻松”列出文件并将文件统计在一起。它必须是一种方式或其他方式。只是为了计算你可以使用Jim的解决方案。
答案 2 :(得分:0)
这个JOIN看起来有点可疑......
JOIN roster_cs368 ON htmp_cs368.userId = roster_cs368.lastName
即使userId
中的htmp_cs368
在lastName
的{{1}}列中具有相同的值,这也是非常糟糕的形式。 JOINS通常应该在命名相似的列上完成。
如果这两列不相关(很难说roster_cs368
何时还有roster_cs368
列),那么这至少是您问题的一部分。
此外,userId
没有意义。这与该列中的任何内容都不匹配。