MySQL - 来自两列的不同值

时间:2013-05-30 07:45:45

标签: java mysql sql jdbc

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

表格看起来像这样

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";

一切正常。你能告诉我,我做错了什么?我尝试使用类似的语句this post suggested。谢谢!

编辑:这是我现在正在使用的EXACT查询:

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

此查询应按照注释中的说明进行操作。但是,我仍然得到例外。为什么这样?感谢您排除故障...

我的mysql版本是5.6。

EDIT2:我不知道问题可能出在JDBC而不是我的陈述。我很抱歉没有在我的问题中提供这些信息...

3 个答案:

答案 0 :(得分: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
    }

答案 1 :(得分:1)

应该这么简单,因为UNION已经删除了重复项

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

MySQL docs for UNION同意这个以及我的排序

  

相反,在第一个SELECT语句中提供列别名并引用ORDER BY中的别名

在SQLFiddle上,我的查询工作http://sqlfiddle.com/#!2/c64e4/7并执行OP http://sqlfiddle.com/#!2/c64e4/8

答案 2 :(得分:0)

只需从代码中删除"+"符号和"Distinct",然后尝试..