1

我有一个包含多个列的表,我需要从中获取其中两个的唯一值。

桌子看起来像这样

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

黑暗中的猜测是,当您检索使用“发件人”而不是“服务”的数据时,这可以解释为什么前两个查询有效而最后一个查询无效。

让我知道是否是这种情况。

假设您正在使用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并执行操作http://sqlfiddle.com/#!2/c64e4/8

于 2013-05-30T07:49:10.287 回答
0

只需从您的代码中删除"+"标志"Distinct"并尝试..

于 2013-05-30T08:35:46.690 回答