SQL DELETE dengan INNER JOIN


120

Ada 2 tabel, spawnlistdan npc, dan saya perlu menghapus data dari spawnlsit. npc_templateid = n.idTemplateadalah satu-satunya hal yang "menghubungkan" tabel. Saya telah mencoba skrip ini tetapi tidak berhasil.

Saya sudah mencoba ini:

DELETE s FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");

1
Lebih kaget karena biasanya komunitas L2 menjaga dirinya sendiri. Agak aneh saat membaca pertanyaan dan berpikir "yang terlihat seperti ... hmm ... itu!" :)
Corbin

1
@Corbin Saya benar-benar mengerti apa yang Anda maksud. Cukup menarik, saya mendapatkan bantuan untuk pertanyaan L2 untuk proyek kerja.
Marco Aurélio Deleu

Hapus dari table1 dari table1 t1 inner join table2 t2 di t1.id = t2.id; secara rinci youtu.be/_tyUVrS2iH4
Amresh Kumar Singh

Jawaban:


224

Tambahkan .*ke sdi baris pertama Anda.

Mencoba:

DELETE s.* FROM spawnlist s
INNER JOIN npc n ON s.npc_templateid = n.idTemplate
WHERE (n.type = "monster");

Berikut adalah kesalahan yang saya dapatkan: [Err] 1064 - Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang benar untuk digunakan di dekat 'spawnlist FROM db.root.spawnlist s INNER JOIN db.root.npc n ON s.npc_t' di baris 1 [Err] DELETE l2revo.root. spawnlist DARI db.root.spawnlist INNER GABUNG db.root.npc n ON s.npc_templateid = n.idTemplate WHERE (n.type = "monster"); [Msg] Selesai - Tidak Berhasil -------------------------------------------- ------
Bergabunglah denganOG

Dalam kesalahan Anda, sepertinya Anda menggunakan dua nama server yang berbeda untuk spawnlist. Saya melihat l2revo.root.spawnlistdan db.root.spawnlist.
ThinkingStiff

saya hanya membuat kesalahan saat menempelkannya di sini, tetapi nama pengguna dan nama db sama, pada kesalahan saya.
Bergabunglah denganOG

Coba tambahkan ASalias Anda.
ThinkingStiff

4
@GauravRamanan the s. * Memberi tahu mysql apa yang harus DIHAPUS, Anda tidak ingin menghapus baris dari tabel
JOINED

12

Jika basis datanya adalah InnoDB maka mungkin ide yang lebih baik untuk menggunakan kunci asing dan kaskade saat hapus, ini akan melakukan apa yang Anda inginkan dan juga tidak menghasilkan data yang berlebihan yang disimpan.

Untuk contoh ini, saya rasa Anda tidak memerlukan yang pertama:

DELETE s 
FROM spawnlist AS s 
INNER JOIN npc AS n ON s.npc_templateid = n.idTemplate 
WHERE n.type = "monster";

Mungkin lebih baik memilih baris sebelum menghapus sehingga Anda yakin ingin menghapus apa yang Anda inginkan:

SELECT * FROM spawnlist
INNER JOIN npc ON spawnlist.npc_templateid = npc.idTemplate
WHERE npc.type = "monster";

Anda juga dapat memeriksa sintaks penghapusan MySQL di sini: http://dev.mysql.com/doc/refman/5.0/en/delete.html


Ini adalah kesalahan yang saya dapatkan: [Err] 1064 - Anda memiliki kesalahan dalam sintaks SQL; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang benar untuk digunakan di dekat INNER JOIN npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monste 'at line 1 [Err] DELETE FROM spawnlist s INNER GABUNG npc n ON s.npc_templateid = n.idTemplate WHERE n.type = "monster"; [Msg] Selesai - Gagal ------------------------ --------------------------
JoinOG

Berubah, mungkin lebih sukses sekarang?
Dan

Kesalahan: [Err] 1066 - Tabel / alias tidak unik: 'npc' [Err] HAPUS spawnlist DARI spawnlist, npc INNER JOIN npc WHERE spawnlist.npc_templateid = npc.idTemplate AND npc.type = "monster"; [Msg] Selesai - Tidak Berhasil -------------------------------------------- ------
JoinOG

Jika Anda hanya akan menjalankannya sekali, Anda dapat menjalankan yang sangat tidak efisien: DELETE FROM spawnlist WHERE npc_templateid IN (PILIH idTemplate dari npc WHERE type = "monster");
Corbin

Itu usaha terakhir saya, jika Anda menghapus hanya dari satu tabel pada gabungan maka saya tidak dapat melihat mengapa itu tidak berhasil.
Dan

6

jika database adalah InnoDB Anda tidak perlu melakukan penggabungan dalam penghapusan. hanya

DELETE FROM spawnlist WHERE spawnlist.type = "monster";

dapat digunakan untuk menghapus semua rekaman yang ditautkan dengan kunci asing di tabel lain, untuk melakukannya Anda harus terlebih dahulu menautkan tabel Anda dalam waktu desain.

CREATE TABLE IF NOT EXIST spawnlist (
  npc_templateid VARCHAR(20) NOT NULL PRIMARY KEY

)ENGINE=InnoDB;

CREATE TABLE IF NOT EXIST npc (
  idTemplate VARCHAR(20) NOT NULL,

  FOREIGN KEY (idTemplate) REFERENCES spawnlist(npc_templateid) ON DELETE CASCADE

)ENGINE=InnoDB;

jika Anda menggunakan MyISAM Anda dapat menghapus catatan yang bergabung seperti ini

DELETE a,b
FROM `spawnlist` a
JOIN `npc` b
ON a.`npc_templateid` = b.`idTemplate`
WHERE a.`type` = 'monster';

di baris pertama saya telah menginisialisasi dua tabel temp untuk menghapus catatan, di baris kedua saya telah menetapkan tabel keberadaan ke a dan b tetapi di sini saya telah menghubungkan kedua tabel bersama dengan kata kunci gabung, dan saya telah mencocokkan kunci utama dan asing untuk kedua tabel yang membuat link, di baris terakhir saya telah memfilter record by field untuk dihapus.


typesebenarnya ada di tabel lain, bukan di spawnlisttabel, jadi perlu bergabung
vitro
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.