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?
3 Réponses :
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;
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
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)
par rapport à la solution GROUP BY
, cela présente l'avantage de pouvoir sélectionner tous les champs, pas seulement les images
.
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
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