J'ai une table avec le contenu comme celui-ci;
SELECT MAX(id) as mid,MAX(is_default) FROM ( (SELECT rel.maxid as id,customer,is_default FROM ( select (id+(is_default*10000000)) as maxid,customer,is_default FROM customer_address ORDER BY is_default DESC) rel ORDER BY maxid) ) rel GROUP BY customer
4 Réponses :
DROP TABLE IF EXISTS my_table; CREATE TABLE my_table (id SERIAL PRIMARY KEY ,customer INT NOT NULL ,is_default TINYINT NOT NULL ); INSERT INTO my_table VALUES (1606384,5828,1), (1573786,5828,0), (1575316,5828,0), (1817769,5828,0), (1806384,5829,0), (1873786,5829,0), (1875316,5829,0), (1917769,5829,0); SELECT x.customer , COALESCE(MAX(y.id),MAX(x.id)) id FROM my_table x LEFT JOIN my_table y ON y.customer = x.customer AND y.is_default = 1 GROUP BY x.customer; +----------+---------+ | customer | id | +----------+---------+ | 5828 | 1606384 | | 5829 | 1917769 | +----------+---------+
Assez brillant d'être honnête! Bon travail !
C'est une approche brillante. Merci. Il a résolu mon problème
@paOxit préférez-vous vraiment une jointure de soi de la table puis s'agglobera alors que vous pouvez simplement regrouper?
@Gosfly Ce n'est pas brillant. C'est affreux. Un auto rejoint pour une table relativement grande lorsque tout ce qui est nécessaire est une agrégation conditionnelle pourrait le prouver que cela.
@ forpas bon point lorsque vous envisagez une grande table. Mais lorsque j'essaie vos résultats de votre approche et de la fraise des fraises sont les mêmes. Pour la requête de la fraise "500 rangées récupérées à partir de 1 sur 100 ms (exécution: 82 ms, récupération: 18 ms)" et pour les vôtres "500 rangées récupérées à partir de 1 sur 100 ms (exécution: 81 ms, récupération: 19 MS) "... L'exécution est à peu près la même
@paroxit Il peut exister de nombreuses solutions pour le même problème. Vous avez choisi la pire solution. Une jointure auto n'est pas nécessaire. Tout ce dont vous avez besoin est une agrégation. Et rappelez-vous que toutes les tables commencent avec 1 rangée, puis ils poussent. Essayez les deux solutions avec une grande table.
Bonté moi. Calmer.
Si vous voulez juste une valeur maximale unique (ID), de préférence avec IS_DEFAULT = 1, puis utilisez:
select max_id from ( select is_default, max(id) as max_id from customer_address group by is_default order by is_default desc limit 1 ) as q;
Cela ne renvoie qu'une seule valeur
Oui, c'était peu clair si @paroxit voulait une valeur unique ou plusieurs valeurs. Compris de l'exemple que, il voulait une valeur unique.
Vous pouvez faire ce qui suit mais @strowberry réponse semble mieux meilleur: Modifier: Ma requête peut être simplifiée avec des coalesce comme ceci: p>
Merci. Il semble que la solution de @strowberry semble fonctionner correctement ..
Vous avez besoin d'une expression de cas: voir le Demo .
Résultats: P> | customer | maxid |
| -------- | ------- |
| 5828 | 1606384 |
| 5829 | 1917769 |
Qu'essayez-vous?