2010-05-20 5 views
1

j'ai une table,auto se joindre à la table

 
    new_id----old_id----created_on 
    1234------5678------20100912 
    5678------3456------20100808 

etc.

je l'ai écrit cette requête,

$q = "select event1.new_id, event1.old_id, event1.created_on,event2.new_id, event2.old_id, event2.created_on 
    FROM replaced_isbns event1 
    JOIN replaced_isbns event2 
    ON event2.new_id = event1.old_id 
    WHERE event1.new_id='$id'"; 

mais j'obtenir le résultat 5678-1234, soit une seule ligne , je veux toutes les rangées ...

@webdestroya,

donne qu'une seule ligne .... je veux sortie comme ça, Pour new_id 1234, old_id sont de 5678,3456 etc

+0

Dans votre exemple, votre table contient seulement 2 lignes. Est-ce vrai pour vos données réelles aussi? –

+0

quelle base de données utilisez-vous? – TerrorAustralis

Répondre

0

si vous voulez toutes les lignes que d'essayer left outer join et remplacer nul avec le nouveau id par exemple

SELECT 
    event1.new_id, event1.old_id, event1.created_on, 
    IFNULL(event2.new_id, event1.new_id), 
    IFNULL(event2.old_id, event1.old_id), 
    event2.created_on 
FROM replaced_isbns event1 
LEFT OUTER JOIN replaced_isbns event2 
    ON event2.new_id = event1.old_id 
WHERE event1.new_id='$id' 

vérifier cela peut vous aider à

+0

@ pranay, il retourne aucun résultat Je veux résultat comme ça, Pour new_id 1234, années old_id sont 5678,3456 etc – San82moon

+0

Salut, il me donne seulement 1234-5678 mais je veux, deuxième résultat aussi à savoir 5678 - 3456 il doit renvoyer toutes les lignes problème – San82moon

+0

est que vous mettez dans votre identifiant où l'état si vous voulez supprimer tous les enregistrements where que u obtenir toutes les données –

0

Pourquoi faire une jointure réflexive? Maintenant, pour chaque ligne de votre résultat, vérifiez si new_id = $ id, ou si old_id = $ id.

+0

il me donne seulement, 1234 - 5678, mais je veux le résultat comme, pour new_id 1234, old_id sont 5678,3456 etc .... il devrait retourner toutes les lignes .... comme dans le tableau. – San82moon

0

Pour autant que je compris, vous avez besoin tous les old_ids pour le new_id: - pour new_id: - 1234 vieux id 'sont 5678 et 3456. même pour deuxième enregistrement: - pour new_id: - 5678 vieux id' sont 3456. J'ai testé cela et cela fonctionne très bien.

select new_id,b.old_id from 
    (select old_id from temp) 
    as b inner join temp as a 
     on a.new_id!=b.old_id 

Faites-moi savoir si c'est celui que vous vouliez ou non. J'espère que cela aide!

0

Vous ne pourrez pas obtenir le résultat que vous souhaitez en utilisant une requête car il n'y a aucun moyen d'interroger les relations récursives dans SQL (bien, ok, START a ... CONNECT BY ... syntaxe et CTE, mais je suppose que vous n'utilisez pas Oracle: p). Mais d'un autre côté, vous pouvez essayer de convertir cette liste d'adjacence en un ensemble imbriqué, car obtenir une branche (tous les enregistrements enfant d'un parent donné) est très facile avec les ensembles imbriqués. Managing Hierarchical Data in MySQL est un article intéressant sur ce sujet.