Проблема:

Когда я обновляю Tom в таблице redo, я хочу, чтобы изменения повлияли на daily и lab независимо от того, существует ли Tom в daily или lab. Даже если его нет в daily или lab Я хочу, чтобы обновление производилось только в таблице redo.

Посмотрите на таблицы ниже:

Первый стол redo

enter image description here

Второй стол daily

enter image description here

Третий стол lab

enter image description here

Что пробовал:

UPDATE redo,daily,lab SET
      redo.name = '$newName', daily.name = '$newName', lab.name = '$newName',
      redo.place = '$newPlace', daily.place = '$newPlace', lab.place = '$newPlace',
      redo.code = '$newCode', daily.code = '$newCode', lab.code = '$newCode',
      redo.age = '$newAge', daily.age= '$newAge', lab.age = '$newAge',
      redo.date = redo.date, daily.date = daily.date, lab.date = lab.date,
      redo.contact = '$newContact',daily.contact = '$newContact', lab.contact='$newContact',
      redo.secondarycontact = '$newSecondaryContact',
      daily.secondarycontact = '$newSecondaryContact',
      lab.secondarycontact = '$newSecondaryContact'
       WHERE redo.no='$no' AND 
(redo.name=daily.name AND redo.name=lab.name) AND 
(redo.place=daily.place AND redo.place=lab.place)

Результат:

Значения обновляются, только если они существуют во всех трех таблицах одновременно.

0
rangerboyy 1 Окт 2020 в 03:06

1 ответ

Лучший ответ

Учитывая ваш вариант использования и отношения, я бы настроил таблицы вот так, если бы это был мой проект:

НОТА:

  • Я сделал некоторые предположения о ваших типах полей ниже, которые могут быть неверными, но адаптировать их по мере необходимости для вашего варианта использования должно быть тривиально.
  • Использование этой структуры потребует немного более сложных или хорошо продуманных запросов, но результат будет НАМНОГО более удобным в обслуживании и гораздо менее подверженным ошибкам.
  • Я бы обычно называл столбцы и тому подобное по-разному, но я решил использовать имена, аналогичные соглашению об именах, которое вы, кажется, используете, чтобы не усложнять, поскольку этот вопрос не о «лучших методах именования столбцов» и т. Д.

Создайте таблицы

Создайте таблицу "действия", чтобы хранить все типы действий в одном месте, обратите внимание на столбец "тип" с возможными значениями 'lab', 'redo', 'daily'

CREATE TABLE `activities` (
  `no` bigint(20) NOT NULL AUTO_INCREMENT,
  `consultation` varchar(255) DEFAULT NULL,
  `lab` varchar(255) DEFAULT NULL,
  `token` VARCHAR(45) NULL,
  `detailsid` bigint(20) NOT NULL,
  `foreignkey` bigint(20) DEFAULT NULL,
  `type` enum('lab','redo','daily') NOT NULL,
  `date` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`no`)
);

Создайте таблицу "activitiyusers", в которой будет храниться подробная информация о людях, связанных с нашей "деятельностью".

CREATE TABLE `activitiyusers` (
  `no` BIGINT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  `gender` ENUM('M', 'F') NOT NULL,
  `age` SMALLINT NULL,
  `contact` VARCHAR(255) NOT NULL,
  `secondarycontact` VARCHAR(255) NULL,
  `place` VARCHAR(255) NULL,
  `code` VARCHAR(45) NULL,
  `createdat` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
  `updatedat` VARCHAR(45) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`no`));

Вставьте тестовые данные

Вставить 3 новых «активных пользователя»

INSERT INTO `activitiyusers` (`name`, `gender`, `age`, `contact`, `secondarycontact`, `place`, `code`) VALUES ('Tom', 'M', '31', '1212121', '3434343', 'California', '1');
INSERT INTO `activitiyusers` (`name`, `gender`, `age`, `contact`, `secondarycontact`, `place`, `code`) VALUES ('Jack', 'M', '45', '99999', '11111', 'Colorado', '2');
INSERT INTO `activitiyusers` (`name`, `gender`, `age`, `contact`, `secondarycontact`, `place`, `code`) VALUES ('Harry', 'M', '99', '112233', '998877', 'Texas', '3');

Вставьте 3 новых действия "повторить", по одному для каждого из трех наших пользователей.

INSERT INTO `activities` (`token`, `detailsid`, `foreignkey`, `type`) VALUES ('0', '1', NULL, 'redo');
INSERT INTO `activities` (`token`, `detailsid`, `foreignkey`, `type`) VALUES ('0', '2', NULL, 'redo');
INSERT INTO `activities` (`token`, `detailsid`, `foreignkey`, `type`) VALUES ('0', '3', NULL, 'redo');

Вставьте 2 новых «ежедневных» задания: одно связано с Томом и заданием «повторить» 1, второе связано с Гарри и заданием «повторить» 3 »

INSERT INTO `activities` (`consultation`, `detailsid`, `foreignkey`, `type`) VALUES ('Cough and Cold', '1', '1', 'daily');
INSERT INTO `activities` (`consultation`, `detailsid`, `foreignkey`, `type`) VALUES ('Panadol', '3', '3', 'daily');

Вставьте 2 новых «лабораторных» задания: одно связано с Джеком и заданием «повторить» 2, второе связано с Гарри и заданием «повторить» 3 »

INSERT INTO `activities` (`lab`, `detailsid`, `foreignkey`, `type`) VALUES ('Blood Test', '2', '2', 'lab');
INSERT INTO `activities` (`lab`, `detailsid`, `foreignkey`, `type`) VALUES ('Injection', '3', '3', 'lab');

Примеры того, как работать с этими данными:

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

Получить все "действия" для "Тома", а также данные о Томе.

SELECT 
    a.no AS activityno,
    a.consultation,
    a.lab,
    a.token,
    a.type,
    a.date,
    au.no AS userno,
    au.name,
    au.gender,
    au.age,
    au.contact,
    au.secondarycontact,
    au.place,
    au.code,
    au.createdat,
    au.updatedate
FROM
    activities a
        JOIN
    activitiyusers au ON a.detailsid = au.no
WHERE
    name = 'Tom';

Получите все "повторяющиеся действия" для "Джека" вместе с данными Джека.

SELECT 
    a.no AS activityno,
    a.consultation,
    a.lab,
    a.token,
    a.type,
    a.date,
    au.no AS userno,
    au.name,
    au.gender,
    au.age,
    au.contact,
    au.secondarycontact,
    au.place,
    au.code,
    au.createdat,
    au.updatedate
FROM
    activities a
        JOIN
    activitiyusers au ON a.detailsid = au.no
WHERE
    name = 'Jack' AND a.type = 'redo';


# Given a known activity that has an id/no of '2', 
# update the details for the activityuser related to that activity 

UPDATE activitiyusers 
SET 
    contact = '22222222',
    age = 46,
    code = 5
WHERE
    no = (SELECT 
            detailsid
        FROM
            activities
        WHERE
            no = 2);
            
            
            

Учитывая известную активность "репо" с идентификатором / номером "3", получите все вспомогательные действия, связанные с этой деятельностью, вместе с деталями связанных действий пользователя.

Обратите внимание, что здесь используется самосоединение mysql, т.е. мы присоединяемся к действиям сами по себе чтобы получить строки subActivity, связанные с данной строкой redoActivity.

SELECT 
    redoActivity.no AS redoactivityno,
    subActivity.no AS subactivityno,
    redoActivity.consultation AS redoactivityconsultation,
    subActivity.consultation AS subactivityconsultation,
    subActivity.lab,
    redoActivity.token,
    subActivity.type,
    redoActivity.date AS redoactivitydate,
    subActivity.date AS subactivitydate,
    au.no AS userno,
    au.name,
    au.gender,
    au.age,
    au.contact,
    au.secondarycontact,
    au.place,
    au.code,
    au.createdat,
    au.updatedate
FROM
    activities subActivity
        JOIN activities redoActivity ON subActivity.foreignkey = redoActivity.no
        JOIN activitiyusers au ON redoActivity.detailsid = au.no
WHERE
    redoActivity.no = 3;
1
Wesley Smith 1 Окт 2020 в 02:27