分别从同一个表中选择多个不同的列

时间:2016-01-18 17:24:25

标签: mysql sql distinct

我们有这个样本数据:

+-------+---------+
| col1  | col2    |
+-------+---------+
|  111  | hello   |
|  222  | hello   |
|  111  | blabla  |
|  444  | there   |
|  555  | blabla  |
|  555  | there   |
+-------+---------+

我需要一个SQL分别为每个列返回不同的值(作为过滤下拉值的feed)。 因此结果应该是:

+-------+---------+
| col1  | col2    |
+-------+---------+
|  111  | hello   |
|  222  | blabla  |
|  444  | there   |
|  555  |         |
+-------+---------+

结果不一定是这种格式;更重要的是,我具有易于访问和迭代的独特值。

我最接近的是从这里: https://stackoverflow.com/a/12188117/169252

select (SELECT group_concat(DISTINCT col1) FROM testtable) as col1, (SELECT group_concat(DISTINCT col2) FROM testtable) as col2;

返回:

+-----------------+-------------------+
| col1            | col2              |
+-----------------+-------------------+
| 111,222,444,555 | velo,hallo,blabla |
+-----------------+-------------------+

这非常接近,如果没有更好的解决方案,我会选择这个;它不是最佳的,因为值以逗号分隔,我需要拆分结果。

我也尝试过:

SELECT DISTINCT from col1,col2 FROM testtable;

这将返回BOTH列的distint值,而不是我想要的值。

此外:

select col1,col2 from testtable group by col1,col2;
在其他地方建议的

不会返回我需要的内容,但会返回每个列的不同内容:)

2 个答案:

答案 0 :(得分:2)

您要问的一个问题是,从关系数据库的角度来看,您所期望的结果集并没有任何意义。一行数据中的每一列都应该与该行中的其他列有关系。

IMO的最佳方法是返回两个结果集,并为每个下拉框处理每个结果集:

SELECT DISTINCT column_1 FROM My_Table

SELECT DISTINCT column_2 FROM My_Table

如果两列不相关,我还会研究为什么在同一个表中有这些数据。如果它们是相关的,并且您尝试为一个列下拉,然后过滤第二个下拉列表中的项目,那么您真的应该返回完整的行集并让前端应用程序处理过滤(并显示独特的结果)。大多数下拉小部件应该允许这种链接。

答案 1 :(得分:-1)

尝试

Select (SELECT DISTINCT col1 from testtable) AS col1, (SELECT DISTINCT col2 from testtable) AS col2;

我认为group_concat将逗号放入返回的表中。