2013-05-30 48 views
1

我有一个表格,有多个列,我需要从其中两列获取唯一值。MySQL - 两列中不同的值

表看起来是这样的

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

所需的输出应该是:服务1,服务2,服务3

我发现了多少种不同的方法(从列发送者和接收者不同的值)要做到这一点,并选择使用这样的联盟:

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。谢谢!

编辑:这是我使用的是现在准确的查询:

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

在评论中提到这个查询应该工作。但是,我仍然得到例外。为什么这样?感谢您排除故障...

我的MySQL版本是5.6。

编辑2:我不知道这个问题可能与JDBC而不是我的声明。我apologiye不提供我的问题此信息...

+0

是'union'是让不同的值,那么为什么乌尔使用'distinct' .. – Rahul

+0

什么是引发sql异常的确切查询? – Stephan

+0

正如我在我的问题中指出的那样,我已经尝试了两个陈述,并且它们都产生了相同的豁免... – Smajl

回答

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 
    } 
+0

他是什么意思? “发件人”和“收件人”是我桌子上的名字。 “服务”只是我在联合声明中使用的别名... – Smajl

+0

我的意思是在代码方检索数据时,请参阅我的更新回答 – Stephan

+0

谢谢!我不知道这个问题是用JDBC而不是我的说法...我很抱歉没有提供这个信息给我的问题... – Smajl

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中的别名

在SQLF上iddle我的查询工作http://sqlfiddle.com/#!2/c64e4/7并执行有机磷农药http://sqlfiddle.com/#!2/c64e4/8

+0

完全同意的情况下。 – Rahul

+2

我认为问题的关键是,无论出于何种原因,查询不适用于Smajl – Mifeet

+0

String query =“SELECT sender AS service FROM messages UNION”+ \t \t“SELECT receiver AS服务从消息ORDER BY服务”; - 我已经试过这个,看看我的问题。 – Smajl

0

只是删除我们的代码的"+"符号和"Distinct",并尝试..

相关问题