2010-03-23 7 views
0

Vous avez ceci:mysql select update

Table a 
ID RelatedBs 
1 NULL 
2 NULL 

Table b 
AID ID 
1 1 
1 2 
1 3 
2 4 
2 5 
2 6 

Besoin Table a d'avoir une liste séparée par des virgules comme indiqué dans le tableau b. Et puis le tableau B deviendra obsolète:

Table a 
ID RelatedBs 
1 1,2,3 
2 4,5,6 

Cela ne rund par tous les enregistrements, mais juste annonce un 'b' à 'table un'

UPDATE a, b 
SET relatedbs = CONCAT(relatedbs,',',b.id) 
WHERE a.id = b.aid 

MISE À JOUR: Merci, 3 réponses (marqué le plus ancien comme réponse)! GROUP_CONCAT est celui à utiliser. Pas besoin d'insérer des virgules entre les ids en utilisant relatedids = CONCAT (relatedids, ',', next_id) qui est fait automatiquement par GROUP_CONCAT.

+1

Pour être honnête, c'est probablement un mauvais choix dans la façon dont vous gérez votre base de données. Pour ne pas dire que vous ne pouvez pas le faire, mais l'idée des clés étrangères est de faire exactement ce que vous avez, pas ce que vous essayez de faire. Quelle est votre motivation? Vos requêtes seront considérablement plus compliquées si vous avez besoin d'obtenir le 'relatedBs' et de les utiliser dans le SQL. –

+0

True. Mais j'utilise toujours des identifiants séparés par des virgules assez souvent quand il s'agit d'une relation un-deux-plusieurs. Quand c'est une relation many-2-many, j'utilise toujours une table mm pour gérer les relations. – Tillebeck

Répondre

1

Regardez dans GROUP_CONCAT (expr)

mysql> SELECT student_name, 
    ->  GROUP_CONCAT(DISTINCT test_score 
    ->      ORDER BY test_score DESC SEPARATOR " ") 
    ->  FROM student 
    ->  GROUP BY student_name; 
1

Vous ne pouvez pas le faire dans la norme SQL. Vous pouvez écrire une procédure stockée pour le faire. J'ai eu un problème similaire, mais j'utilisais PostgreSQL donc j'ai pu le résoudre en écrivant une fonction personnalisée globale de sorte que vous pouvez faire des requêtes comme

select aid, concat(id) 
from b group by 
aid 

Mise à jour: MySQL a une fonction d'agrégation group_concat de sorte que vous pouvez faire quelque chose comme

SELECT id,GROUP_CONCAT(client_id) FROM services WHERE id = 3 GROUP BY id 

comme indiqué here.