2011-07-23 1 views
1

Compte tenu des tables MySQL 5.0:mise à jour sql seulement le plus ancien d'un grand nombre à une association

clients 
======= 
id int 

users 
===== 
id   int 
client_id int 
is_primary tinyint 

Un client peut avoir de nombreux utilisateurs. Je veux mettre à jour users.is_primary = 1 pour que le plus petit users.id par users.client_id

Par exemple, compte tenu de ces utilisateurs:

users 
id client_id is_primary 
============================ 
1 1   0 
2 1   0 
3 2   0 
4 2   0 
5 3   0 

Je veux finir avec:

users 
id client_id is_primary 
============================ 
1 1   1 
2 1   0 
3 2   1 
4 2   0 
5 3   1 

Existe-t-il un moyen d'écrire une instruction de mise à jour pour le faire?

+0

serveur SQL 2005, 2008? – anivas

+2

Pourquoi la ligne 'id = 5' a' is_primary = 1'? Ce client, 'client_id = 1', a déjà un utilisateur principal. –

+0

MySQL 5.0, mis à jour la question. – jemminger

Répondre

3
update users 
set is_primary = 1 
where id in (select * from (select min(id) from users group by client_id) as t) 
+0

On dirait que ça va le faire, merci! – jemminger

+0

Je pense que vous devriez alias la colonne 'min (id)'. Ou MySQL lui permettra-t-il d'aller unaliased? –

+0

@Andriy M: non, ce n'est pas nécessaire. –

4

Sinon, vous devriez être en mesure d'utiliser la jointure comme ceci:

UPDATE users 
    INNER JOIN (
    SELECT MIN(id) AS id 
    FROM users 
    GROUP BY client_id 
) m ON users.id = m.id 
SET users.is_primary = 1 
+0

+1: Je pensais que vous me battez à –

+0

+1 Bonne solution aussi :) –

+0

+1, cela a aidé avec une autre mise à jour. – jemminger

Questions connexes