0

我正在使用 Mysql 和 PHP

如果我有一张桌子

-------------------
| no1 | no2 | no3 | 
|-----|-----|-----|
|  A  |  B  |  C  |
|  B  |  C  |  A  |
|  C  |  B  |  A  |
-------------------

我想返回行的唯一组合

SELECT `no1`, `no2`, `no3`
FROM  `items` 
GROUP BY `no1', `no2`, `no3`

我希望它只返回一行,因为如果您忽略订单,字段组合是相同的。

我该怎么办?

4

3 回答 3

1

如果您只有两列,这很容易:

select distinct least(col1, col2), greatest(col1, col2)
from t;

有了三个,这有点难:

select distinct least(no1, no2, no3) as smallest,
       (case when no1 not in (least(no1, no2, no3), greatest(no1, no2, no3)) then no1
             when no2 not in (least(no1, no2, no3), greatest(no1, no2, no3)) then no2
             else no3
        end) as middle,
      greatest(no1, no2, no3) as biggest
from items;

请注意,这distinct是获取不同组的更简洁的方法。

编辑:

如果您想对更多列执行此操作,MySQL 不提供该nth()功能(类似于least()and greatest()。您可以执行以下操作。取消透视值(假设每行都有一个 id),然后使用group_concat()选项order by

select distinct nos
from (select id, group_concat(noi order by noi) as nos
      from (select id,
                   (case when n.n = 1 then no1
                         when n.n = 2 then no2
                         when n.n = 3 then no3
                    end) as noi
            from items i cross join
                 (select 1 as n union all select 2 union all select 3) n
           ) nn
      group by id
     ) nn;

这会将值作为逗号分隔列表返回。

于 2013-09-04T11:12:01.883 回答
0

除了编写 mysql 服务器使用的函数之外,我唯一能想到的就是使用 SQL 和 PHP 的组合,如下所示:

SELECT distinct
    `no1`, `no2`, `no3`
FROM  `items` 

这将给出不明确的行,然后我们可以做到这一点。将其弹出到一个数组中并对每一行进行排序:

$array=(0 => 'C', 1 => 'B', 2 => 'A');
sort($array);

将所有新位收集到一个多维数组中,并在它们上使用array_unique以仅获取您想要的不同值。

您还可以复制在 MYSQL 中按字母顺序排列列的相同功能,尽管这无疑会非常棘手。

于 2013-09-04T11:08:59.057 回答
0

试试看:

SELECT group_concat(concat(`no1`, `no2`, `no3`) as STH
FROM  `items` 
GROUP BY `no1', `no2`, `no3`
于 2013-09-04T11:09:03.513 回答