我正在使用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`
我希望这只返回一行,因为如果忽略顺序,字段组合是相同的。
我该怎么做?
答案 0 :(得分: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()
和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;
这将以逗号分隔列表的形式返回值。
答案 1 :(得分:0)
如果没有编写mysql服务器使用的函数,我唯一能想到的就是像这样使用SQL和PHP的组合:
SELECT distinct
`no1`, `no2`, `no3`
FROM `items`
这将给出删除行,然后我们就可以做到这一点。将其弹出一个数组并对每一行进行排序:
$array=(0 => 'C', 1 => 'B', 2 => 'A');
sort($array);
将所有新位收集到一个多维数组中,并使用array_unique来获取所需的不同值。
您还可以复制在MYSQL中按字母顺序排列列的相同功能,尽管这无疑会非常棘手。
答案 2 :(得分:0)
试试:
SELECT group_concat(concat(`no1`, `no2`, `no3`) as STH
FROM `items`
GROUP BY `no1', `no2`, `no3`