[RESOLU] Liaison d'enregistrements selon un champ déterminé

Petit nouveau ! | 4 Messages

01 oct. 2013, 20:06

Bonjour,
Je souhaite écrire une requête qui me permet de rajouter un nouveau champ "linkId" rassemblant les enregistrements convenant sur la même valeur d'un certain champ c1 . Le champ "linkId" est de type int et il s'incrémente à chaque nouvelle variété de valeur de c1.

Soit l'exemple :

Code : Tout sélectionner

name phone John 0592466396 Jonh 0924633588 Daniel 0652436465 Joseph 0454646463 Daniel 0513464555

le résultat attendu de la requête est alors :

Soit l'exemple :

Code : Tout sélectionner

name phone lindId John 0592466396 1 Jonh 0924633588 1 Daniel 0652436465 2 Joseph 0454646463 3 Daniel 0513464555 2


any help? Merci ;)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 oct. 2013, 20:59

salut,

c'est pas ainsi qu'il faut faire ;)
il te faut une table (entité) avec les gens et une table avec les numéros (voir une table avec les type de n°) ainsi tu auras un modèle sain et évolutif

par exemple
CREATE TABLE gens (
  idgens     INT         NOT NULL PRIMARY KEY,
  nomgens    VARCHAR(50) NOT NULL,
  prenomgens VARCHAR(50) NOT NULL
);

CREATE TABLE typetel (
  idtypetel INT         NOT NULL PRIMARY KEY,
  nomtype   VARCHAR(20) NOT NULL
);

CREATE TABLE numerogens (
  idgens    INT         NOT NULL,
  idtypetel INT         NOT NULL,
  numero    VARCHAR(20) NOT NULL
);

ALTER TABLE numerogens ADD CONSTRAINT fk_gens FOREIGN KEY idgens REFERENCES gens (idgens);
ALTER TABLE numerogens ADD CONSTRAINT fk_typenumero FOREIGN KEY idtypetel REFERENCES typetel (idtypetel);
j'ai fait du sql du coup tu ne te débrouille pour les auto_increment des clef primaire :)


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 4 Messages

02 oct. 2013, 09:53

mon but c'est d'ajouter un champ d'étiquetage et de rester sur la même table d'entrée

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

02 oct. 2013, 12:57

Ça va être un mercier sans nom, mais c'est réalisable.
Sur la base avec un trigger avant insertion et une séquence.

@+
Il en faut peu pour être heureux ......

antoine94200
Invité n'ayant pas de compte PHPfrance

03 oct. 2013, 10:13

Bonjour,
c'est sous oracle ou mysql ?

Petit nouveau ! | 4 Messages

03 oct. 2013, 14:42

Bonjour,
c'est sous mysql
Bonjour,
c'est sous oracle ou mysql ?

antoine94200
Invité n'ayant pas de compte PHPfrance

03 oct. 2013, 15:33

Sous mysql tu peux t'inspirer de ça :

select u.name,u.phone,d.lindId from utilisateurs u join (SELECT
name,
min(@rownum := @rownum + 1) AS lindId
FROM
utilisateurs,
(SELECT @rownum := 0) r
group by name) d on d.name=u.name

je te laisse modifier la requête pour avoir un pas de 1 ...

antoine94200
Invité n'ayant pas de compte PHPfrance

03 oct. 2013, 15:33

Sous mysql tu peux t'inspirer de ça :
select u.name,u.phone,d.lindId from utilisateurs u join (SELECT
name,
min(@rownum := @rownum + 1) AS lindId
FROM
utilisateurs,
(SELECT @rownum := 0) r
group by name) d on d.name=u.name
je te laisse modifier la requête pour avoir un pas de 1 ...

antoine94200
Invité n'ayant pas de compte PHPfrance

03 oct. 2013, 15:45

voilà ta réponse est ici , en position 5.

http://stackoverflow.com/questions/1895 ... r-in-mysql
SELECT u.name,
u.phone,
if(@prev=u.name,@rownum,@rownum:=@rownum+1) as lindId,
@prev=u.name
from utilisateurs,
(SELECT @rownum := 0) r

Petit nouveau ! | 4 Messages

03 oct. 2013, 17:05

merci ça répond bien à mon problème !!
juste une petit correction qui donne la requête correcte ;)
SELECT u.name,
u.phone,
IF(@prev=u.name,@rownum,@rownum:=@rownum+1) AS lindId,
@prev := u.name
FROM utilisateurs,
(SELECT @rownum := 0) r