sql присоединиться к вопросу

У меня есть следующие таблицы

nid    timestamp   title

82  1245157883  Home
61  1245100302  Minutes
132    1245097268  Sample Form
95  1245096985  Goals & Objectives
99  1245096952  Members

А ТАКЖЕ

        pid     src         dst                                     language



        70  node/82         department/34-section-2      
        45  node/61/feed    department/22-section-2/feed     
        26  node/15         department/department1/15-department1    
        303 node/101        department/101-section-4 

Это фрагменты таблиц и не хватает остальной части данных (они оба довольно большие), но я пытаюсь присоединиться к столбцу dst из второй таблицы в первую. Они должны совпадать с их «nid», но вторая таблица имеет node / [nid], что делает это более сложным. Я также хочу игнорировать те, которые заканчиваются «кормом», поскольку они не нужны для того, что я делаю.

Большое спасибо

EDIT: Мне плохо, если не упомянуть об этом, но первая таблица - это результат sql из

select nid, MAX(timestamp) as timestamp, title from node_revisions group by nid ORDER BY timestamp DESC LIMIT 0,5

Вторая таблица имеет имя "url_alias"

sql,

1

Ответов: 7


5 принят

пытаться

select * from table1 inner join table2 on src=concat('node/',nid)

Редактирование
отредактировано для отражения изменений в OP

select `nid`, MAX(`timestamp`) as `timestamp`, `title` from `node_revisions` inner join `url_alias` on `src`=concat('node/',`nid`) group by `nid` ORDER BY `timestamp` DESC LIMIT 0,5

0

Я не знаю, какую базу данных вы используете. Тем не менее, я предлагаю вам написать функцию синтаксического анализа, которая возвращает nid из этого столбца. Затем вы можете получить такой запрос (если GET_NID - это функция, которую вы определили):

SELECT * from T1, T2
WHERE T1.nid = GET_NID( T2.node)

0

У вас есть несколько вариантов.

  1. напишите функцию, которая преобразует src в nid и присоединяется к t1.nid = f (t2.src) - вы не сказали, какую СУБД вы используете, но у большинства есть способ сделать это. Это будет медленным, но это зависит от того, насколько велики таблицы.

  2. Подобно этому, сделайте представление, которое имеет вычисленное поле, используя эту функцию - такую ??же скорость, но может быть легче понять.

  3. Создайте новое поле nid в t2 и используйте функцию для его заполнения. Создайте триггеры вставки и обновления, чтобы обновить их, а затем присоединитесь к ним. Это лучше, если вы часто запрашиваете это.

  4. Преобразуйте t2 так, чтобы он имел поле nid и вычислил src из этого и другого поля, которое является шаблоном, в который должен быть вставлен nid.


0

Я бы потянул идентификатор узла во второй таблице в отдельный столбец. В противном случае любая попытка объединения двух таблиц приведет к сканированию таблицы с некоторой обработкой в ??поле src (я предполагаю, что вы имели в виду поле src, а не поле dst), и производительность будет проблематичной.


0
ВЫБРАТЬ *
FROM (SELECT *, 'node /' + nid AS src FROM table1) t1
INNER JOIN table2 t2
ON t1.src = t2.src
SQL,
Похожие вопросы