MySQL - SELECT Sorgusuna dayalı UPDATE sorgusu

İki olay arasında tarih-zamana dayalı bir ilişki olup olmadığını (aynı tablodan) kontrol etmem gerekiyor.

Bir veri kümesi belirli olayların bitiş tarih-saatini, diğer veri kümesi ise diğer olayların başlangıç tarih-saatini içerecektir.

İlk etkinlik ikinci etkinlikten önce tamamlanırsa, onları birbirine bağlamak istiyorum.

Şu ana kadar elimde olan:

SELECT name as name_A, date-time as end_DTS, id as id_A 
FROM tableA WHERE criteria = 1

SELECT name as name_B, date-time as start_DTS, id as id_B 
FROM tableA WHERE criteria = 2

Sonra ben de onlara katılırım:

SELECT name_A, name_B, id_A, id_B, 
if(start_DTS > end_DTS,'VALID','') as validation_check
FROM tableA
LEFT JOIN tableB ON name_A = name_B

Daha sonra, validation_check alanıma bağlı olarak, SELECT iç içe olacak şekilde bir UPDATE sorgusu çalıştırabilir miyim?

Çözüm

Aslında bunu iki şekilde yapabilirsiniz:

MySQL güncelleme birleştirme sözdizimi:

UPDATE tableA a
INNER JOIN tableB b ON a.name_a = b.name_b
SET validation_check = if(start_dts > end_dts, 'VALID', '')
-- where clause can go here

ANSI SQL sözdizimi:

UPDATE tableA SET validation_check = 
    (SELECT if(start_DTS > end_DTS, 'VALID', '') AS validation_check
        FROM tableA
        INNER JOIN tableB ON name_A = name_B
        WHERE id_A = tableA.id_A)

Hangisi size daha doğal geliyorsa onu seçin.

Yorumlar (8)
UPDATE
    `table1` AS `dest`,
    (
        SELECT
            *
        FROM
            `table2`
        WHERE
            `id` = x
    ) AS `src`
SET
    `dest`.`col1` = `src`.`col1`
WHERE
    `dest`.`id` = x
;

Umarım bu işinize yarar.

Yorumlar (3)

Birisi hangi tabloyu hedeflerse hedeflesin bir veritabanından diğerine veri güncellemek istiyorsa, bunu yapmak için bazı kriterler olmalıdır.

Bu, tüm seviyeler için daha iyi ve temiz:

UPDATE dbname1.content targetTable

LEFT JOIN dbname2.someothertable sourceTable ON
    targetTable.compare_field= sourceTable.compare_field
SET
    targetTable.col1  = sourceTable.cola,
    targetTable.col2 = sourceTable.colb, 
    targetTable.col3 = sourceTable.colc, 
    targetTable.col4 = sourceTable.cold 

Traaa! Harika çalışıyor!

Yukarıdaki anlayışla, işinizi yapmak için ayarlanan alanları ve "on" kriterlerini değiştirebilirsiniz. Ayrıca kontrolleri gerçekleştirebilir, ardından verileri geçici tablo(lar)a çekebilir ve ardından tablo ve sütun adlarınızı değiştirerek yukarıdaki sözdizimini kullanarak güncellemeyi çalıştırabilirsiniz.

Umarım işe yarar, yaramazsa bana haber verin. Sizin için tam bir sorgu yazacağım.

Yorumlar (0)