2014-09-11 2 views
0

Я пытаюсь обновить строку в таблице amga только с одной строкой из таблицы amgb, соединенной их itemTempId.MySql, объединяющее обновление с внутренним соединением и ограничение

Моя проблема заключается в том, что в таблице amgb может быть до 6 строк для этого itemTempId, и мне нужно использовать только один из них для обновления.

Я знаком с выполнением обновлений с помощью объединений, но когда я добавил Limit (чтобы получить только одну строку), я получаю сообщение об ошибке Incorrect usage of update and limit. Я читал, что это невозможно, но есть ли другой способ сделать это?

Amga

"id" "itemId" "itemTempId" "itemImageName" "itemName"     "itemCountry" "userId" 
"1"  "US1"  "T001"   \N    "Samsung Galaxy Note 5"  "US"   "1" 
"2"  "CA2"  "T002"   \N    "Samsung Galaxy Note 6"  "CA"   "2" 
"3"  "UK3"  "T003"   \N    "Samsung Galaxy Note 7"  "UK"   "3" 

amgb

"id" "itemId" "itemTempId" "itemImageName"  "userId" 
"1"  "US1"  "T001"   "front.jpg"   "1" 
"2"  "US1"  "T001"   "side-left.jpg"  "1" 
"3"  "US1"  "T001"   "side-right.jpg" "1" 
"4"  "US1"  "T001"   "back.jpg"   "1" 
"5"  "CA2"  "T002"   "front.jpg"   "2" 
"6"  "CA2"  "T002"   "side-left.jpg"  "2" 
"7"  "CA2"  "T002"   "side-right.jpg" "2" 
"8"  "CA2"  "T002"   "back.jpg"   "2" 
"9"  "UK3"  "T003"   "front.jpg"   "3" 

Sql Я использовал

update amga a inner join amgb b on a.itemTempId = b.itemTempId 
set a.itemImageName = b.itemImageName where a.itemTempId = 'T001' limit 1; 

ожидат Ted результаты: Таблица AMGA после обновления

"id" "itemId" "itemTempId" "itemImageName" "itemName"     "itemCountry" "userId" 
    "1"  "US1"  "T001"  front.jpg  "Samsung Galaxy Note 5"  "US"   "1" 
    "2"  "CA2"  "T002"  \N    "Samsung Galaxy Note 6"  "CA"   "2" 
    "3"  "UK3"  "T003"  \N    "Samsung Galaxy Note 7"  "UK"   "3" 

Примечание: itemTempId обновляется с front.jpg, которая является первой строки для itemTempId = T001 в amgb

Любая помощь оценена.

Обновление Я заметил, что это работает, если я удаляю лимит и что он обновляется. Но правильно ли это сделать? Что делает MySql с другими строками в списке?

update amga a inner join amgb b on a.itemTempId = b.itemTempId 
set a.itemImageName = b.itemImageName where a.itemTempId = 'T001'; 
+1

Как вы определяющую «первый ряд» при вступлении? Я полагаю, что это не случайная строка, это строка с наименьшим идентификатором? (Так как в таблице нет гарантированного порядка строк). – Josien

+0

Первый/самый высокий. В этом случае это будет '1' – Norman

+0

И для' T002' (если 'T002' используется в обновлении) это будет' 5' – Norman

ответ

1

Может быть, вы можете использовать подзапрос:

UPDATE amga a 
SET a.itemImageName = 
    (SELECT b.itemImageName 
    FROM amgb b 
    WHERE b.itemTempId = 'T001' 
    ORDER BY b.id LIMIT 1) 
WHERE a.itemTempId = 'T001' 
+0

В вашем sql можно обновить два столбца с данными из примера Eg: 'SET.itemImageName, SET itemImagePath = (выберите b.itemImageName, b.itemImagePath и т. Д.)' – Norman

+0

Afaik, к сожалению, нет. Но вы можете попробовать следующую инструкцию обновления с помощью соединения. Я не добавляю его в ответ, так как не уверен. Вы можете форматировать и попробовать: UPDATE Amga INNER JOIN (SELECT b.itemImageName, b.itemImagePath ОТ amgb б WHERE b.itemTempId = 'T001' ORDER BY b.id LIMIT 1) С на с. itemTempId = a.itemTempId SET a.itemImageName = c.itemImageName, a.itemImagePath = b.itemImagePath ГДЕ a.itemTempId = 'T001'; Я проверил этот ответ: http://stackoverflow.com/questions/16473402/update-multiple-columns-from-subquery – yalpertem

+0

Я попробую. Я использую ваш первый ответ. Спасибо за это. – Norman

Смежные вопросы