2013-05-27 2 views
1

У меня есть две таблицы в базе данных, один сделок стол:MySQL: Объединение двух таблиц

id mac   timestamp  siteid 


1  C8BCC8BD7684 1365987620  5 


2  8C2DAA4CB9E6 1365995414  4 

другой является equipment_details стол:

id  mac_address  organization 


1  00:00:0E   Fujitsu limited 


2  00:00:00   Xerox corporation 


3  C8:BC:C8   Apple, inc. 


4  8C:2D:AA:   Apple, inc. 

мне нужно присоединиться эти две таблицы. Таким образом, таблица выход должен быть, как

id mac   timestamp  siteid  organization 

1  C8BCC8BD7684 1365987620  5   Apple, inc. 


2  8C2DAA4CB9E6 1365995414  4   Apple, inc. 

Могу ли я использовать что-то вроде WordWrap (подстрока (transactions.mac, 0, 6), 2, ":", правда), чтобы извлечь первые 6 букв из transactions.mac ? Я пробовал код ниже, но я получаю ошибку mysql:

"SELECT transactions.mac,equipment_details.mac_address,equipment_details.organization FROM `transactions`, `equipment_details` WHERE transactions.mac LIKE equipment_details.mac_address+'%' " 

Любая помощь очень ценится!

+0

Каков выходной сигнал ошибки? Вы выбрали свой db? – diegoperini

+1

Если вы хотите присоединиться к 2 таблицам, то между двумя таблицами должен быть relavent KEY – Gautam3164

+0

да, я сделал. ошибка: «Синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL, проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с« + »%» по строке 1 – NewPHP

ответ

2
SELECT a.*, 
     b.Organization 
FROM transactions a 
     INNER JOIN equipment_details b 
      ON SUBSTRING(a.mac, 1,6) = REPLACE(b.mac_address, ':', '') 

ВЫВОД

╔════╦══════════════╦════════════╦════════╦══════════════╗ 
║ ID ║  MAC  ║ TIMESTAMP ║ SITEID ║ ORGANIZATION ║ 
╠════╬══════════════╬════════════╬════════╬══════════════╣ 
║ 1 ║ C8BCC8BD7684 ║ 1365987620 ║  5 ║ Apple, inc. ║ 
║ 2 ║ 8C2DAA4CB9E6 ║ 1365995414 ║  4 ║ Apple, inc. ║ 
╚════╩══════════════╩════════════╩════════╩══════════════╝ 

Единственная проблема с этим является то, что он не использует индекс и будет работать очень медленно, если у вас есть большой база данных. Лучший способ сделать это - нормализовать таблицы :)

+0

Да, это очень медленно. :) – NewPHP

+0

Это очень медленно, потому что он не будет использовать индекс, даже если вы определили его, поскольку столбцы, используемые для соединения, обрабатывались в функции. предлагаемый дизайн, почему бы не поставить столбец в транзакции таблицы с именем «mac_six», который содержит первые 6 символов «MAC» и определить индекс на нем. Во второй таблице удалите ':' из 'Mac_address', определите индекс и он будет работать быстрее. –

+0

да, я попробую это. – NewPHP

1

Попробуйте как этот

SELECT transactions.mac,equipment_details.mac_address,equipment_details.organization 
FROM `transactions` 
JOIN 'equipment_details' 
ON equipment_details.mac_address = REPLACE(SUBSTRING('transactions.mac',6),":","") 

вам не нужно, как заявление для этого сейчас ... если вы хотите сравнить с LIKE, то его синтаксис должен быть

WHERE transactions.mac LIKE equipment_details.mac_address = 'my_string%' 
+0

все еще есть ошибка: Сообщение: SQLSTATE [42000]: Синтаксическая ошибка или нарушение прав доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '+'% '' в строке 4. (Я использую zend framework). – NewPHP

+0

Попробуйте с моим редактированием ... – Gautam3164

+0

Спасибо за обновление, и теперь mysql-запрос без ошибок. Но я получаю пустой массив. Мне было интересно, что обновленный код будет искать как «ON 00: 00: 0E = 00000E». Поэтому он должен быть пустым. Есть ли способ добавить: для SUBSTRING ('transaction.mac', 6) ")? – NewPHP

0

Как насчет этого?

SELECT tr.mac,ed.mac_address,ed.organization 
FROM `transactions` tr 
JOIN 'equipment_details' ed 
ON ed.mac_address = REPLACE(SUBSTRING('tr.mac',6),":","") 

С Заменить можно непосредственно сравнивать адрес макинтош с «:» и те, с нет «:»

надеюсь, что это помогает.

0

Вы также можете попробовать это. Inner Join может помочь вам присоединиться к двум таблицам. Я полагаю, что ваш первичный ключ является «id» в обеих таблицах &, на который вы ссылаетесь «id» в качестве внешнего ключа в таблице equipment_details.

select tr.id,tr.mac,tr.timestamp,tr.siteid,ed.organisation from transactions tr inner join equipment_details ed ON ed.mac_address = SUBSTRING('transactions.mac',6) where tr.id = ed.id 
Смежные вопросы