2017-11-16 10 views
1

このSQLクエリに少し問題があります。私はそれを回避することができません。モデレータのような役割を持つユーザーが、その下のユーザーのアカウントタイプを変更できるサイトがありますが、現在は変更履歴がありますが、正しい情報を表示するのに問題があります。複数のネストされたサブクエリから選択するSQLクエリ

役割::私はこれらの3つのテーブルを持っている ROLE_ID、Role_Type

ユーザー: USER_ID、ファーストネーム、姓、ROLE_ID

変更ログ: LOG_ID、Moderator_ID、USER_ID、Prev_Role_ID、New_Role_ID、 Logtime

説明すると、変更ログには一意のLog_IDがあり、次にModerator_IDは変更を行う人のUser_IDであり、User_IDはユーザーのaccのIDですそれが変わったのはおかしい。そしてRole_IDはちょうどそれが何に変わったのかと同じものです。

これで、ログID、司会者の名字と姓、ユーザーの名字と姓、および以前の役割と新しい役割を表示します。

私はネストされた選択を使用していますが、私は多くのレコードを持っていることを除いてすべてがうまく表示されているので、テーブルの結合に問題があると思うし、Log_IDでグループ化すると、私の記録は間違った役割の変更を伴います。すべての組み合わせが返されるので、いくつかのJOINSが必要だと思いますが、何をどこに置くべきかわかりません。

SELECT changelogs.log_id, a.lastname AS mlastname, a.firstname AS mfirstname, 
b.lastname AS ulastname, b.firstname AS ufirstname, c.role_type AS 
pre_role, d.role_type AS new_role, changelogs.logtime 

FROM (SELECT log_id, lastname, firstname FROM users, changelogs 
     WHERE users.user_id = changelogs.mod_id) a, 

    (SELECT log_id, lastname, firstname FROM users, changelogs 
     WHERE users.user_id = changelogs.user_id) b, 

    (SELECT log_id, role_type FROM roles, changelogs 
     WHERE changelogs.prev_role_id = roles.role_id) c, 

    (SELECT log_id, role_type FROM roles, changelogs 
     WHERE roles.role_id = changelogs.role_id) d, changelogs; 

私は基本的にはちょうどちょうどそのIDのの代わりに、名前とそのIDのの代わりに役割と、それは正確に私の変更ログテーブルを表示します。

結果: LOG_ID、mLastname、mFirstname、uLastname、uFirstname、Pre_Role、NEW_ROLE、時間

このばかげた質問して申し訳ありませんが、それはかなり長い間私を盗聴されています。

+0

@Miggyは... * B倍倍のc倍D倍のchangelog *行 –

+0

これはあなたの最初の質問であるとして検討する既存のクエリの大幅なデカルト積の問題があります*あなたの問題を解決したか、あなたの解決策を見つけるのに最も役立ったので、答えを受け入れるには、Tick ** "](https://ibb.co/ikqyO6)をクリックしてください(nb:元に戻すにはもう一度クリックしてください) 。答えを受け入れることで、問題が解決されたことが分かり、解答を探したり解決する質問を探すときに時間を節約できます。 ** btw:受諾ごとに2つの評判ポイントが得られます。** –

答えて

1

テーブルに意味のある別名に参加しました(シーケンス、B、C、Dを使用していない...)、あなたはここにサブクエリを必要としない、それぞれを与える:

SELECT 
     c.log_id 
    , m.lastname AS mlastname 
    , m.firstname AS mfirstname 
    , u.lastname AS ulastname 
    , u.firstname AS ufirstname 
    , p.role_type AS pre_role 
    , r.role_type AS new_role 
    , c.logtime 
FROM changelogs c 
INNER JOIN users u ON c.user_id = u.user_id 
INNER JOIN users m ON c.mod_id = m.user_id 
INNER JOIN roles r ON c.role_id = r.role_id 
INNER JOIN roles p ON c.prev_role_id = p.role_id 

先端いつでも表名STOPの後にコンマを入力することができます。カンマを削除し、このテーブルに参加する必要があると考えてください。神の明示的な結合を私はすぐに使用します。

+0

これはうまくいきました。 – tb95

+0

問題はありません、 "ダニをクリックすることを忘れないでください" –

0

このソリューションをお試しください。正常に動作するはずです。 「[ください*:

SELECT a.log_id, c.lastname AS mlastname, c.firstname AS mfirstname, b.lastname AS ulastname 
    , b.firstname AS ufirstname, e.role_type AS pre_role, d.role_type AS new_role, a.logtime 
FROM Changelogs a 
JOIN Users b ON a.user_id = b.user_id 
JOIN Users c ON a.moderator_id = c.user_id 
JOIN Role d ON a.New_Role_id = d.Role_ID 
JOIN Role e ON a.prev_role_id = e.Role_ID 
関連する問題