web-dev-qa-db-fra.com

Sélection d'une combinaison distincte de 2 colonnes dans mysql

J'ai une table mysql qui ressemble à ceci:

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

J'ai besoin d'une requête pour sélectionner toutes les lignes avec les colonnes 2 et 3 distinctes, par exemple le résultat que je veux pour cet exemple ressemblera à ceci:

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

j'ai trouvé quelques exemples sur la façon de le faire, mais ils sélectionnent tous distinct sur chaque colonne individuellement.

21
James Harzs

En supposant que la première colonne soit unique, vous pouvez le faire:

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

Voyez le travail en ligne: sqlfiddle

15
Mark Byers

Mise à jour 1

Mieux vous utilisez ceci contre ci-dessus.

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

Démo

La raison pour laquelle je dis est parce que l'utilisation de CONCAT ne donne pas le résultat souhaité dans ce cas La première requête me renvoie 5 lignes, mais CONCAT me renvoie 4 lignes, ce qui est INCORRECT.

J'espère que vous avez mon point.


Supposons que les colonnes de la table sont (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;

exemple de travail en direct

27
Fahim Parkar

En supposant que les colonnes de la table soient (id, col1, col2, col3), vous pouvez:

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

La requête la plus simple pour cela est 

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

Utiliser la méthode group by me renvoie des lignes supplémentaires, où la vérification explicite de chaque champ bien que plus longtemps renvoie le même nombre d'enregistrements que 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

Cette requête s'assure que la combinaison de column1 et column2 est unique, tout en sélectionnant la valeur minimale de la troisième colonne

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