0

我的任务是处理我遇到问题的查询。这是查询:

给定用户 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;

我得到一个空集的结果。我的桌子满了。我希望有人能纠正我的错误。

我已经包含了我的架构:

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的经验很少。我还必须提出:如果未指定用户 ID,则所有文件,如果未指定月份,则所有用户,如果未指定,则所有月份和用户。我被困住了,不知所措。我很感激任何帮助!谢谢!

4

3 回答 3

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值。

于 2012-12-15T01:25:43.940 回答
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 的解决方案。

于 2012-12-15T01:39:11.420 回答
0

这个 JOIN 看起来有点可疑......

JOIN roster_cs368 ON htmp_cs368.userId = roster_cs368.lastName

即使userIdin在 的列中htmp_cs368具有等效值,这也是非常糟糕的形式。JOINS 通常应该在同名列上完成。lastNameroster_cs368

如果这两列不相关(很难说什么时候roster_cs368也有一userId列),那么这至少是你问题的一部分。

还有,htmp_cs368.monthIn = 'monthIn'没有意义。这也不会匹配该列中的任何内容。

于 2012-12-15T01:29:55.990 回答