如何在MySQL中将多个列视为一个列?

4

abc包含相同类型的一些值。我需要选择所有独特的值。如果只有一列,我将使用类似以下的语句:

SELECT DISTINCT a FROM mytable ORDER BY a;

但是我需要把abc列视为一个整体,并获取它们之间出现的所有唯一值。

以CSV表格形式表示的mytable如下所示,第一行命名了列:

a, b, c
1, 2, 3
1, 3, 4
5, 7, 1

查询的结果应该是:

1
2
3
4
5
7

更新:我不明白为什么你们都建议在外面再套一个SELECT?在我看来,答案是

(SELECT `a` AS `result` FROM `mytable`)
UNION (SELECT `b` FROM `mytable`)
UNION (SELECT `c` FROM `mytable`)
ORDER BY `result`;

不是吗?


你能否在你的问题中添加一个带有表格结构的输出示例? - mirza
4个回答

6

很抱歉,我之前误解了你的问题。这是更新后的查询语句。

select a from my table
UNION
select b from my table
UNION
select c from my table

6

所以你想要从a、b和c中获得一个只包含唯一值的列?试试这个:

(select a as yourField from d1)
union
(select b from d2)
union
(select c from d3)
order by yourField desc
limit 5

工作示例

根据要求更改后编辑... 这里有您请求的order bylimit。当然,在这个示例中,您只会得到5条记录。


1
不,这不会产生重复项。联合操作将从所有三列中给出不同的结果集。 - AJP
我还想给生成的列分配一个别名,进行排序和限制。在这种情况下,我应该把 ASORDER BYLIMIT 放在哪里?我也很好奇可以在哪里放置分号(s) :-) - Ivan
谢谢。我现在正在阅读http://dev.mysql.com/doc/refman/5.0/en/union.html。 - Ivan
@mosty 我已经测试过你的查询了,是的,没有重复的查询,但是结果集不如预期。对于我的示例数据集,有4行“1,2,3,4”,但应该是“1,2,3,4,5,6,7,8,9,10”。 - mirza
1
查询中有一个限制。 OP问在哪里限制查询,因此我提供了信息。 我还在答案中添加了一个可工作的例子。 - Mosty Mostacho
显示剩余3条评论

2
SELECT tmp.a
FROM 
(SELECT column_1 AS a
FROM table
UNION
SELECT column_2 AS a
FROM table
UNION
SELECT column_3 AS a
FROM table) AS tmp
ORDER BY `tmp`.`a` ASC

你的意思是这会产生不同的结果吗? - Ivan
@Ivan 我已经测试了答案的第一个版本,结果有所不同,但我认为在我的方法中不需要使用distinct,但你也可以很容易地实现order by和limit。 - mirza
手册上说,只要我将单独的“SELECT”子句括在括号中,并且可以在第一个“SELECT”中使用“AS”指定别名,就可以将我的“ORDER BY”和“LIMIT”放到最后。 - Ivan
@Ivan 不确定您想要什么结果集。您可以添加一个示例结果集以澄清此问题。 - mirza
1
示例结果已包含在问题中,不是吗? - Ivan
我仍然想知道你的查询语句怎么比SELECT a AS result FROM mytable) UNION (SELECT b FROM mytable) UNION (SELECT c FROM mytable) ORDER BY result更好,为什么需要额外的SELECT包装它。 - Ivan

2

试试这个:

SELECT b.iResult
FROM
    (SELECT a as iResult FROM tableName
        UNION
    SELECT b as iResult FROM tableName
        UNION
    SELECT c as iResult FROM tableName) b
ORDER BY b.iResult 
LIMIT BY 10 -- or put any number you want to limit.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接