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には多くの問題があるようです。私はそれが同様にコンパイルできるとは思わない。

試す:

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;

必要なのは1つだけJOINです。これにより、ユーザーとそのすべてのファイルが一覧表示されます。そして、リンゴをリンゴ(userId!= lastName)と同一視するように注意してください。

ファイルの数やファイルサイズなどを取得するには、GroupBy効果的に必要です。ただし、ファイルを一覧表示して、ファイルの数を「簡単に」まとめることはできません。それはいずれかの方法である必要があります。カウントのためだけに、ジムのソリューションを使用できます。

于 2012-12-15T01:39:11.420 に答える
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

これは、1か月の間に表示および非表示になるファイルを考慮しない単純なアプローチですが、このためのデータがテーブルにないようです。

また、何のatmp_cs368ためにあるのか、またはtime1つのテーブルの列にyear値があるように見える理由も明確ではありません。

于 2012-12-15T01:25:43.940 に答える
0

このJOINは少し疑わしいようです...

JOIN roster_cs368 ON htmp_cs368.userId = roster_cs368.lastName

userIdinの列にhtmp_cs368同等の値がある場合でも、これは非常に悪い形式です。JOINSは通常、同じ名前の列で実行する必要があります。lastNameroster_cs368

これらの2つの列が無関係である場合(列がいつあるかを判断するのは困難ですroster_cs368userId、それは少なくとも問題の一部になります。

また、htmp_cs368.monthIn = 'monthIn'意味がありません。これもその列の何にも一致しません。

于 2012-12-15T01:29:55.990 に答える