0
votes

retourne une ligne mysql non dupliquée

Disons que j'ai une table avec deux colonnes begin_timestamp et images .

Je fais d'abord cette déclaration

[abc.jpg, test.jpg]

Cela me renverra une liste de chaînes comme:

'123.jpg'
'abc.jpg'
'test.jpg'

Ce que je veux en second lieu est de vérifier si un ou plusieurs éléments de cette liste ont une duplication dans le trou table. Si oui, supprimez cette chaîne de la liste. Comme si une autre ligne du tableau contient 123.jpg comme valeur d'image, je veux juste la liste comme

SELECT images 
FROM myTable 
WHERE begin_timestamp < 1546646400 && images != 'default.png';

Ma question est maintenant, comment puis-je Je combine la première et la deuxième étape en une seule instruction mySQL?


6 commentaires

quel est le type de données de la colonne images ?


vous pourriez probablement simplement utiliser DISTINCT


Voulez-vous vérifier les doublons dans la table sans la clause where ? Ou souhaitez-vous uniquement vérifier les doublons dans le jeu de résultats?


Je veux vérifier les doublons dans le tableau sans la clause where


Avez-vous également besoin d'interroger d'autres champs de la ligne? ou seulement des images ?


@Felk uniquement des images


3 Réponses :


4
votes

Vous pouvez y parvenir en utilisant GROUP BY .

Commençons par faire la sélection comme ci-dessus:

SELECT images FROM (
    SELECT images, MIN(begin_timestamp) as begin_timestamp
    FROM myTable
    GROUP BY images
    HAVING COUNT(images) = 1)
WHERE begin_timestamp < 1546646400 AND images != 'default.png';

maintenant, car nous avons regroupés par images , nous avons accès à fonctions d'agrégation . Nous pouvons ajouter le filtre souhaité comme celui-ci à la fin de la requête:

HAVING COUNT(images) = 1

Notez que parce que nous avons groupé par images , c'est maintenant le seule chose que nous pouvons interroger directement dans la partie SELECT . Si vous souhaitez sélectionner d'autres champs, vous devez également le faire via une fonction d'agrégation, par ex. SELECT images, MIN (some_field) . Ou si images est la clé primaire, utilisez-la dans une sous-requête ou une jointure.


Si vous devez supprimer les doublons avant d'appliquer le WHERE condition de filtre, vous pouvez utiliser une sous-requête comme celle-ci:

SELECT images
FROM myTable
WHERE begin_timestamp < 1546646400 AND images != 'default.png'
GROUP BY images;


3 commentaires

Désolé, cela ne fonctionne pas. Cela filtre ma liste comme [123.jpg, 123. jpg, abc.jpg, test.jpg] à [abc.jpg, test.jpg] Mais je veux vérifiez la table des trous. Comme si ce sont les deux seules entrées avec 123.jpg et qu'il n'y a pas d'autre entrée avec 123.jpg dans la table de trous, je veux les garder dans cette liste. S'il y a une autre entrée avec 123.jpg quelque part dans le tableau mais pas dans cette liste, je veux exclure ces deux de la liste


Hade to edit it as this for no sql syntax error: SELECT images FROM (SELECT images, begin_timestamp FROM myTable GROUP BY images, begin_timestamp HAVING COUNT (images) = 1) AS InnerStatement WHERE begin_timestamp <1546646400 AND images! = 'Default .png '; Mais j'obtiens toujours des résultats qui ont des doublons dans le tableau en dehors du clausel where


oui, j'ai oublié que begin_timestamp n'est pas disponible en raison du group by Je pense que je l'ai corrigé dans mon ansert, mais aller avec la réponse d'Omar Matijas est probablement plus facile pour votre cas De toute façon



2
votes

Une autre façon de le faire est d'utiliser NOT EXISTS.

Je suppose que vous avez un champ id dans le tableau:

SELECT images 
FROM myTable m1
where m1.begin_timestamp < 1546646400 && m1.images != 'default.png'
and NOT EXISTS(select 1 from myTable m2 where m1.images = m2.images and m1.id != m2.id)


1 commentaires

par rapport à la solution GROUP BY , cela présente l'avantage de pouvoir sélectionner tous les champs, pas seulement les images .



0
votes

déclarer @image varchar (max) set @ image = ''

SELECT @ image = @ image + ',' + images DE maTable WHERE begin_timestamp <1546646400 AND images! = 'Default.png' GROUP BY images HAVING COUNT (*) = 1

sélectionnez @image


0 commentaires