1

複数の列を持つテーブルがあり、そのうちの 2 つから一意の値を取得する必要があります。

テーブルはこんな感じ

msgid    sender    receiver  payload
1        service1  service2  xxx
2        service1  service3  xxx
3        service2  service3  xxx
...

必要な出力は次のとおりです: service1、service2、service3 (列の送信者と受信者からの個別の値)

これを行う方法についてさまざまなアプローチを見つけ、次のように UNION を使用することを選択しました。

String query = "(SELECT sender AS service FROM messages) UNION " +
        "(SELECT receiver AS service FROM messages) ORDER BY service";

私も試しました

String query = "(SELECT DISTINCT sender AS service FROM messages) UNION " +
        "(SELECT DISTINCT receiver AS service FROM messages) ORDER BY service";

UNION はすでに一意の値を返しているため、これは同じものを生成するはずです。ただし、mysql 例外が発生します。

java.sql.SQLException: Column 'sender' not found.

しかし、列送信者は存在します! 私が走るとき

String query = "SELECT DISTINCT sender FROM messages";

すべてがうまく機能します。何が間違っているのか教えてください。この投稿が示唆するように、同様のステートメントを使用しようとしました。ありがとう!

編集:これは私が現在使用している正確なクエリです:

String query = "SELECT sender AS service FROM messages UNION SELECT receiver AS service FROM messages ORDER BY service";

このクエリは、コメントに記載されているとおりに機能するはずです。ただし、まだ例外が発生します。なんでそうなの?トラブルシューティングをありがとう...

私のmysqlバージョンは5.6です。

EDIT2:問題がJDBCにあり、私の声明ではない可能性があるとは思いもしませんでした。質問でこの情報を提供しなかったことをお詫びします...

4

3 に答える 3

2

最初の 2 つのクエリが機能し、最後のクエリが機能しない理由を説明できるのは、「サービス」ではなく「送信者」を使用してデータを取得するときです。

その場合はお知らせください。

あなたが使用していると仮定しますJDBC

    String query = "SELECT sender AS service FROM messages UNION SELECT receiver AS service FROM messages ORDER BY service";
    ResultSet rs = ps.executeQuery(query);
    while (rs.next()) {
        String value = rs.getString("sender"); // instead it should be "service"
        // Some other actions
    }
于 2013-05-30T08:02:20.203 に答える
1

UNION はすでに重複を削除しているため、このように単純なはずです。

SELECT sender AS service FROM messages
UNION
SELECT receiver AS service FROM messages
ORDER BY service;

UNIONのMySQL ドキュメントは、これと私の並べ替え ここに同意します

代わりに、最初の SELECT ステートメントで列エイリアスを指定し、ORDER BY でエイリアスを参照します。

SQLFiddle では、私のクエリはhttp://sqlfiddle.com/#!2/c64e4/7で動作し、OP を実行しますhttp://sqlfiddle.com/#!2/c64e4/8

于 2013-05-30T07:49:10.287 に答える
0

"+"符号を削除してコードから削除して"Distinct"みてください..

于 2013-05-30T08:35:46.690 に答える