таблица самостоятельного соединения - PullRequest
1 голос
/ 20 мая 2010

у меня есть стол,

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

и т.д.

я написал этот запрос,

$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'";

но я получаю результат как 5678 - 1234, то есть только одна строка, я хочу, чтобы все строки ...

@ webdestroya,

это дает только одну строку .... я хочу вывод, как это, Для new_id 1234, old_id это 5678,3456 и т. Д.

Ответы [ 4 ]

0 голосов
/ 20 мая 2010

Вы не сможете получить желаемый результат, используя запрос, поскольку нет способа запросить рекурсивные отношения в SQL (ну, хорошо, Oracle имеет синтаксис START WITH ... CONNECT BY ... и CTE, но Я полагаю, вы не используете Oracle: p).

Но с другой стороны, вы можете попытаться преобразовать этот список смежности во вложенный набор, потому что получить ветвь (все дочерние записи данного родителя) очень легко с помощью вложенных наборов. Управление иерархическими данными в MySQL - интересная статья на эту тему.

0 голосов
/ 20 мая 2010

Зачем самому присоединяться?

SELECT replaced_isbns.*
FROM replaced_isbns
WHERE new_id = '$id'
OR old_id = '$id'

Теперь для каждой строки в вашем результате проверьте, если new_id = $ id или old_id = $ id.

0 голосов
/ 20 мая 2010

Насколько я понял, вам нужны все old_ids для new_id: - для new_id: - 1234 старых идентификатора - это 5678 и 3456. аналогично для второй записи: - для new_id: - 5678 старых идентификаторов 3456. Я проверил это, и он работает нормально.

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

Дайте мне знать, если вы этого хотели или нет. Надеюсь, это поможет!

0 голосов
/ 20 мая 2010

, если вы хотите все строки, чем попробуйте left outer join и замените ноль новым идентификатором, например

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'

проверьте, может ли это помочь вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...