mysql查询返回一个空结果集

时间:2012-12-15 01:02:04

标签: mysql

我遇到了一个我遇到问题的查询。这是查询:

  

根据用户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的经验很少。我还必须提出: 如果未指定用户标识,则所有文件(如果未指定月份),所有用户(如果未指定),则为所有月份和用户。 我陷入了困境中。我感谢任何帮助!谢谢!

3 个答案:

答案 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_cs368lastName的{​​{1}}列中具有相同的值,这也是非常糟糕的形式。 JOINS通常应该在命名相似的列上完成。

如果这两列不相关(很难说roster_cs368何时还有roster_cs368列),那么这至少是您问题的一部分。

此外,userId没有意义。这与该列中的任何内容都不匹配。