стовпчик оновлення mysql зі значенням з іншої таблиці


221

У мене два столи, обидва схожі

id  name  value
===================
1   Joe     22
2   Derk    30

Мені потрібно скопіювати значення valueз tableAна tableBоснові чекової назви у кожній таблиці.

Якісь поради щодо цього UPDATEтвердження?

Відповіді:


413

На додаток до цієї відповіді, якщо вам потрібно змінити значення tableB.value відповідно до tableA.value, ви можете зробити, наприклад:

UPDATE tableB
INNER JOIN tableA ON tableB.name = tableA.name
SET tableB.value = IF(tableA.value > 0, tableA.value, tableB.value)
WHERE tableA.name = 'Joe'

так, INNER JOINідеально в цій ситуації. Я також використовував CONCAT_WSдля об'єднання найменування
прудукту

2
Чи можна це зробити за допомогою псевдонімів?
Геллі Енн

Я спробував це, але не мав успіху, тому що кількість "постраждалих рядків" дає мені 5690, але загальна кількість рядків - 59643, чому? це запит:UPDATE participants_registrations INNER JOIN participants ON participants.id = participants_registrations.participantId INNER JOIN registrations ON registrations.id = participants_registrations.registrationId LEFT JOIN groups ON (groups.id = registrations.groupId) SET registrations.groupId = groups.id, registrations.groupName = groups.name, participants.memberOfGroupName = groups.name
Великий Сфінкс

Це не працює. tableB все ще має власні дані без змін. wtools.io/paste-code/bzWA Зразок на основі ОП та цієї відповіді.
sniffingdoggo

157

вам потрібно з'єднати дві таблиці:

наприклад, ви хочете скопіювати значення nameз tableA у те місце, tableBде вони однаковіID

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 
WHERE t2.name = 'Joe'

ОНОВЛЕННЯ 1

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.id = t2.id
SET t1.name = t2.name 

ОНОВЛЕННЯ 2

UPDATE tableB t1 
        INNER JOIN tableA t2 
             ON t1.name = t2.name
SET t1.value = t2.value

1
ive понад 1k запис з різними іменами та значеннями, ось ваша приказка лише для 1-го запису
LeoSam

ви можете просто вилучити whereпункт або змінити whereпункт, залежно від ваших потреб ..
John Woo

також таблиця B отримала більше записів, ніж таблиця A, моя ідея - це перевірка від таблиці B до a, чи існує ім'я, скопіюйте значення "value" в таблицю B,!
LeoSam

я не знаю, чи я зрозумів ваше питання чітко, чи можете ви перевірити мою оновлену відповідь?
Джон Ву

Я намагався обидва оновлення, 2-й говорить, що відбувається на 734 рядках, я перевірив значення, все ще 0 не змінено
LeoSam

91

Друга можливість -

UPDATE TableB 
SET TableB.value = (
    SELECT TableA.value 
    FROM TableA
    WHERE TableA.name = TableB.name
);

7
Так, немає необхідності в складних приєднаннях, коли все, що нам потрібно, це оновити поле зі значенням з іншої таблиці.
davidkonrad

8
Так, це працює чудово, але дуже, дуже повільно на великих наборах даних. Якщо ви працюєте з невеликими таблицями, цей спосіб чудово, але я рекомендую ПРИЄДНАЙТЕСЬ, як показано вище, для чого-небудь іншого.
frijj2k

Також у цьому сценарії таблиці A і B не можуть бути однаковою таблицею через обмеження SQL.
Muhwu

@ frijj2k це все-таки буде повільним, якщо .nameйого індексувати в обох таблицях?
Стеверино

3

Другий варіант можливий також, якщо ви використовуєте безпечний режим оновлень (і ви отримуєте помилку, що вказує на те, що ви намагалися оновити таблицю без WHERE, що використовує стовпець KEY), додавши:

UPDATE TableB  
SET TableB.value = (  
SELECT TableA.value  
    FROM TableA  
    WHERE TableA.name = TableB.name  
)  
**where TableB.id < X**  
;


1

Зберігайте свої дані в темп. Таблиці

Select * into tempTable from table1

Тепер оновіть стовпець

 UPDATE table1
    SET table1.FileName = (select FileName from tempTable where tempTable.id = table1.ID);

0

У моєму випадку прийняте рішення було занадто повільним. Для таблиці з 180K рядками швидкість оновлень становила близько 10 рядків в секунду. Це з індексами на елементи з'єднання.

Нарешті я вирішив свою проблему за допомогою процедури:

CREATE DEFINER=`my_procedure`@`%` PROCEDURE `rescue`()
BEGIN
    declare str VARCHAR(255) default '';
    DECLARE n INT DEFAULT 0;
    DECLARE i INT DEFAULT 0;
    DECLARE cur_name VARCHAR(45) DEFAULT '';
    DECLARE cur_value VARCHAR(10000) DEFAULT '';
    SELECT COUNT(*) FROM tableA INTO n;
    SET i=0;
    WHILE i<n DO 
      SELECT namea,valuea FROM tableA limit i,1 INTO cur_name,cur_value;
      UPDATE tableB SET nameb=cur_name where valueb=cur_value;
      SET i = i + 1;
    END WHILE;

END

Я сподіваюся, що це допоможе комусь у майбутньому, як і мені


-4

Якщо у вас є спільне поле в обох таблицях, то це так просто! ....

Таблиця-1 = таблиця, в якій потрібно оновити. Таблиця-2 = таблиця, з якої ви берете дані.

  1. зробіть запит у таблиці-1 та знайдіть загальне значення поля.
  2. зробіть цикл і знайдіть усі дані з таблиці-2 відповідно до значення таблиці 1.
  3. знову внесіть запит на оновлення в таблицю 1.

$qry_asseet_list = mysql_query("SELECT 'primary key field' FROM `table-1`");

$resultArray = array();
while ($row = mysql_fetch_array($qry_asseet_list)) {
$resultArray[] = $row;
}



foreach($resultArray as $rec) {

    $a = $rec['primary key field'];

    $cuttable_qry = mysql_query("SELECT * FROM `Table-2` WHERE `key field name` = $a");

    $cuttable = mysql_fetch_assoc($cuttable_qry);



    echo $x= $cuttable['Table-2 field']; echo " ! ";
    echo $y= $cuttable['Table-2 field'];echo " ! ";
    echo $z= $cuttable['Table-2 field'];echo " ! ";


    $k = mysql_query("UPDATE `Table-1` SET `summary_style` = '$x', `summary_color` = '$y', `summary_customer` = '$z' WHERE `summary_laysheet_number` = $a;");

    if ($k) {
        echo "done";
    } else {
        echo mysql_error();
    }


}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.