7
votes

Colonne de chèques pour une valeur unique

Ma table:

id attribute
1  2
5  1


0 commentaires

3 Réponses :


7
votes

Vous pouvez utiliser cette approche: xxx

Une meilleure approche pourrait être: xxx


3 commentaires

Cette méthode est très inefficace, car elle dirigera cette requête interne pour chaque ligne de test. Cela commencera à avoir une incidence sur la performance assez rapidement lorsque la table grandit.


@Braiba: Vous avez raison. La deuxième approche pourrait réduire la complexité.


La requête interne est fonctionnellement la même que celle de Ypercube's en premier; Je ne vois pas ce que la requête extérieure ajoute ici, ou je manque quelque chose?



1
votes

Eh bien, j'utiliserais l'approche suivante à la place:

     SELECT DISTINCT ta.id, ta.attribute
       FROM test ta
  LEFT JOIN test tb
         ON ta.id = tb.id AND ta.attribute <> tb.attribute
      WHERE tb.id IS NULL;


1 commentaires

Les requêtes imbriquées sont bien aussi longtemps que vous les rejoignez, plutôt que de les mettre dans une clause Select / OUT / ON. Rejoindre une table sur elle-même comme ça n'est pas beaucoup mieux cependant; Le temps de traitement augmentera toujours de manière exponentielle car la table augmente.



8
votes
SELECT id, MIN(attribute) AS attribute
FROM test 
GROUP BY id
HAVING MIN(attribute) = MAX(attribute) ;

8 commentaires

+1 pour la façon la plus efficace de le faire. La chose min = max est vraiment intelligente; Je me souviendrai de ce tour pour l'avenir.


J'aime vraiment cette réponse aussi. Quelle est l'étiquette sur tellement? D'abord venu d'abord servir ou meilleure réponse?


@Terry Uhlang La meilleure réponse a le sens le plus sens à moi puisque ce sera le premier autre utilisateur du même problème, voir quand ils rechercheront cette question.


@Terryuhlang: La réponse que vous avez utilisée ou celle qui vous ait mieux aidé ou celle que vous pensez est la meilleure. Le choix est à vous: Quelle réponse faire J'accepte si j'ai plusieurs réponses correctes?


Sûrement si min (attribut) = max (attribut) Il serait sans danger pour simplement Sélectionnez ID, attribut ? Pourrait-il y avoir un avantage de performance pour réutiliser min () dans ce cas?


@Airthomas, cela pourrait être sûr mais ce ne serait pas une requête valide. Et même si min (attribut) = max (attribut) Il peut toujours y avoir des lignes où l'attribut est null . Donc, ce n'est pas sûr non plus.


En réalité, vous pouvez sélectionner des colonnes non incluses dans le groupe par instruction dans MySQL. Mais votre point sur null est pris.


Oui, vous pouvez. En fonction des paramètres que vous avez.