web-dev-qa-db-ja.com

mysqlで異なる2列の組み合わせを選択する

次のようなmysqlテーブルがあります。

1   value1    value2    3534
2   value1    value1    8456
3   value1    value2    3566
4   value1    value3    7345
5   value2    value3    6734

異なる列2と3を持つすべての行を選択するクエリが必要です。たとえば、この例で必要な出力は次のようになります。

1   value1    value2    3534
2   value1    value1    8456
4   value1    value3    7345
5   value2    value3    6734

私はそれを行う方法についていくつかのサンプルを見つけましたが、それらはすべて各列で個別に選択します。

22
James Harzs

最初の列が一意であると仮定すると、これを行うことができます:

SELECT id, col2, col3, col4
FROM yourtable
WHERE id IN
(
    SELECT MIN(id)
    FROM yourtable
    GROUP BY col2, col3
)

オンラインで動作することを確認してください: sqlfiddle

15
Mark Byers

アップデート1

上記に対してこれを使用する方が良いです。

SELECT id, col2, col3, col4
FROM yourtable
GROUP BY col2, col3;

デモ

私が言っている理由は、CONCATを使用すると、この場合。最初のクエリは5行を返しますが、CONCATは4行を返しますが、これは間違っています。

あなたが私のポイントを得たことを願っています。


テーブル内の列が(id、col2、col3、col4)であると仮定します。

SELECT DISTINCT(CONCAT(col2, col3)) as "dummy column", id, col2, col3, col4
FROM yourtable
GROUP BY CONCAT(col2, col3);

OR

SELECT id, col2, col3, MIN(col4)
FROM yourtable
GROUP BY col2, col3;

実際の動作例

28
Fahim Parkar

テーブル内の列が(id, col1, col2, col3)、 あなたは出来る:

SELECT  *
FROM    YourTable yt
JOIN    (
        SELECT  MIN(id) as minid
        FROM    YourTable
        GROUP BY
                col1, col2
        ) filter
ON      filter.minid = yt.id
1
Andomar

これに対する最も簡単なクエリは

SELECT col1, col2, MIN(col3)
FROM myTable
GROUP BY col1, col2
0
Sashi Kant

Group byメソッドを使用すると、余分な行が返されます。各フィールドを明示的にチェックすると、count(Distinct ..)と同じレコード数が長く返されます。

SELECT id, col2, col3, col4
FROM yourtable yt
WHERE id =
(
 SELECT MIN(id)
 FROM yourtable yt1
 WHERE yt.col2 = yt1.col2
 AND yt.col3 = yt1.col3
)
0
Derya

このクエリは、列3と列2の組み合わせが一意であることを確認し、列3の最小値を選択します

SELECT col1, col2, MIN(col3)
FROM yourTable
GROUP BY col1, col2
0
schadr