0
votes

Groupe MySQL par colonne et obtenez de préférence de préférence sur une autre valeur de colonne

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


1 commentaires

Qu'essayez-vous?


4 Réponses :


2
votes
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 |
+----------+---------+

7 commentaires

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.



0
votes

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;


2 commentaires

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.



1
votes

Vous pouvez faire ce qui suit mais @strowberry réponse semble mieux meilleur: xxx

Démo ici

Modifier: Ma requête peut être simplifiée avec des coalesce comme ceci: xxx

Deuxième démo ici


1 commentaires

Merci. Il semble que la solution de @strowberry semble fonctionner correctement ..



0
votes

Vous avez besoin d'une expression de cas: xxx pré>

voir le Demo .
Résultats: P>

| customer | maxid   |
| -------- | ------- |
| 5828     | 1606384 |
| 5829     | 1917769 |


0 commentaires