2
votes

Code Mysql pour marquer les valeurs nouvelles et dupliquées

J'ai une table mysql (ci-dessous) avec quelques valeurs, j'ai besoin d'obtenir les nouvelles valeurs et les valeurs en double

J'ai essayé SELECT *, COUNT (SerialNumber) FROM config_log GROUP BY SerialNumber ;

Mais il ne renvoie que le nombre de doublons. Comment trouver ça ???

Merci

Tableau:

Id   SerialNumber   ConfigDate   Type      Name
---+--------------+------------+----------+-------
1    11111          2018-12-22   New          a
2    22222          2018-12-22   New          b
3    33333          2018-12-22   New          c
4    11111          2018-12-23   Duplicate    a

Tableau des produits:

 ProductId    Name
-----------+------
  1           a
  2           b
  3           c

Résultat attendu

   Id   SerialNumber   ConfigDate  ProductId
    ---+--------------+-----------+---------
    1    11111          2018-12-22    1
    2    22222          2018-12-22    2
    3    33333          2018-12-22    3
    4    11111          2018-12-23    1


2 commentaires

quelle est votre version mysql


Version du serveur: 10.1.28-MariaDB


3 Réponses :


4
votes

Vous pouvez essayer ci-dessous -

DEMO strong>

select id,SerialNumber,ConfigDate, case when num=1 then 'New' else 'Duplicate' end as  Type,
productid,name
from
(
SELECT 
    @row_number:=CASE
        WHEN @SerialNumber = SerialNumber THEN @row_number + 1
        ELSE 1
    END AS num,
    @SerialNumber:=SerialNumber as PSerialNumber, id, SerialNumber,ConfigDate,productid,name
FROM
    t1 left join product on productid=pid ,(SELECT @SerialNumber:=0,@row_number:=0) AS t
order by SerialNumber
)A


4 commentaires

Merci mec. son travail, j'ai besoin de rejoindre une autre table avec ce comment c'est possible ???


@ JIJOMONK.A, pourriez-vous s'il vous plaît ajouter ce tableau à votre question


@ JIJOMONK.A, vérifiez ici - dbfiddle.uk/…


Merci mon frère. Merci pour le soutien.



1
votes

la requête mysql suivante produira le résultat attendu

SELECT cl.*, 
       IF (cl.id = (SELECT Min(id) 
                    FROM   `config_log` 
                    WHERE  cl.serialnumber = serialnumber 
                    ORDER  BY id ASC), 'NEW', 'DUPLICATE') AS type, 
       p.name 
FROM   `config_log` AS `cl` 
       INNER JOIN products AS p 
               ON p.id = cl.productid 

Testé sur mysql Distrib 5.7.24, pour Linux (x86_64)


3 commentaires

Merci mon frère


comment écrire où une condition comme type = 'NEW' ou type = 'DUPLICATE'


vous pouvez ajouter en fin de compte comme ceci "HAVING type = 'DUPLICATE'" .. Cela peut paraître pas logique d'ajouter avoir sans group by mais ça marche .. pas la meilleure solution ... mieux vaut refaire la requête si vous avez exigences différentes



1
votes

pour filtrer le résultat, vous pouvez utiliser comme ceci

SELECT cl.*, 
       IF (cl.id = (SELECT Min(id) 
                    FROM   `config_log` 
                    WHERE  cl.serialnumber = serialnumber 
                    ORDER  BY id ASC), 'NEW', 'DUPLICATE') AS type, 
       p.name 
FROM   `config_log` AS `cl` 
       INNER JOIN products AS p 
               ON p.id = cl.productid 
HAVING type = 'DUPLICATE' 


0 commentaires