2013-01-21 4 views
1

Imaginez que vous avez une table comme ceci:ID parent et enfant

+-------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+------------------+------+-----+---------+----------------+ 
| id   | int(11)   | NO | PRI | NULL | auto_increment | 
| name  | varchar(255)  | NO |  |   |    | 
| parent_id | int(11)   | YES | MUL | NULL |    | 
+-------------+------------------+------+-----+---------+----------------+ 

Appelons ce tableau locations

Cela représente une ville ou un état.

Par exemple si le champ name est Los Angeles, son parent_id représentera une ligne avec un champ nameCalifornia.

Maintenant, imaginez que vous avez une autre table comme ceci:

+-----------------+---------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+-----------------+---------------+------+-----+---------+----------------+ 
| id    | int(11)  | NO | PRI | NULL | auto_increment | 
| name   | varchar(450) | YES |  | NULL |    | 
| state   | varchar(135) | YES |  | NULL |    | 
+-----------------+---------------+------+-----+---------+----------------+ 

Appelons ce tableau cities.

Chaque ligne représente une ville et le champ id correspond au id dans le tableau locations.

Dans ce tableau, le champ state est toujours vide, donc je voudrais le mettre à jour avec le champ name de la table locations.

J'ai essayé cette requête afin d'obtenir la valeur state, mais il ne semble pas fonctionner (il faut beaucoup de temps et rien ne se passe):

SELECT name FROM locations WHERE id IN 
(SELECT parent_gid FROM locations INNER JOIN cities 
ON locations.id = cities.id); 

Toutes les suggestions sur la façon d'atteindre ce?

+0

Les informations de votre deuxième table "villes" ne sont-elles pas complètement redondantes à la première table? Pourquoi en avez-vous besoin du tout? – Argeman

+0

Vous avez raison. Malheureusement, il n'est pas en mon pouvoir de modifier le schéma de la base de données. Quoi qu'il en soit, c'est un exemple d'abstraction qui, une fois résolu, me permettrait de résoudre un problème plus important. – rfc1484

+0

comment sont reliées les tables? que voulez-vous faire, mettre à jour ou sélectionner seulement? –

Répondre

1

si seulement ne voulez déclaration SELECT, utilisez JOIN

SELECT a.id, a.name, b.name As State 
FROM cities a 
     INNER JOIN locations b 
      ON a.id = b.id 

mais si vous souhaitez mettre à jour la table,

UPDATE cities a 
     INNER JOIN locations b 
      On a.ID = b.ID 
SET  a.State = b.name 

MISE À JOUR

SELECT a.id, a.name, c.name As State 
FROM cities a 
     INNER JOIN locations b 
      ON a.id = b.id 
     LEFT JOIN locations c 
      On b.parent_ID = c.id 
+0

Le problème avec cette requête 'SELECT' est qu'il récupèrerait seulement le nom de la ville, au lieu du nom de l'état. Autrement dit, 'a.name' et' b.name' contiendraient la même valeur. Afin de récupérer le nom de l'état, il est nécessaire d'utiliser le champ 'parent_id', mais je ne sais pas exactement comment. – rfc1484

+0

comment pouvez-vous associer 'parent_id' sur l'autre table? –

+0

Je ne pense pas que vous pouvez le relier directement, mais connaissant une ville 'id' vous pouvez récupérer le' parent_id', et avec cet 'parent_id' l'état' name'. Je pense que c'est possible mais je ne sais pas exactement comment. – rfc1484

1

Ici, vous allez: Je ne sais pas comment sav e et le lier sur sql fiddle - mais voici le code:

 
create table loca (
    locaid int, 
    locaname varchar(25), 
    locaparent varchar(25)); 

create table cityb (
    citybid int, 
    citybname varchar(25), 
    citybstate varchar(25)); 

insert into loca (locaid, locaname, locaparent) 
    values (1, 'name1', 'parent1'); 
insert into loca (locaid, locaname, locaparent) 
    values (2, 'name2', 'parent2'); 
insert into loca (locaid, locaname, locaparent) 
    values (3, 'name3', 'parent3'); 
insert into cityb (citybid, citybname, citybstate) 
    values (1, 'city1', ''); 
insert into cityb (citybid, citybname, citybstate) 
    values (2, 'city2', ''); 
insert into cityb (citybid, citybname, citybstate) 
    values (3, 'city3', ''); 

update loca, cityb 
    set citybstate = locaparent 
     where locaid = citybid;
+0

Malheureusement' locaparent' c'est un 'id' et je veux le nom de l'état situé dans le champ' locaname'. Cependant, c'était un exemple d'abstraction très clair, donc +1 – rfc1484