Berikut ini adalah catetan-catetan query MySQL agak tingkat lanjut yang agak-agak fak! untuk diingat-ingat, makanya daripada diingat, mending dicatat saja.
Semoga membantu diriku yang sedang di masa depan.
Find Duplicates of Multiple Column
tl;dr
SELECT id, first_coloumn, second_coloumn, count(*)
FROM `agent_contacts`
WHERE `office_id` = '323'
GROUP BY first_coloumn, second_coloumn
HAVING count(*)>1
csb
Mencari duplikasi pada banyak kolom tertentu, misalnya nama depan dan nama belakang. Query-nya adalah semacam ini :
SELECT id, first_name, last_name, count(*)
FROM `agent_contacts`
WHERE `office_id` = '323'
GROUP BY first_name, last_name
HAVING count(*)>1
Hint utama dari query ini adalah HAVING count(*)>1
alias lebih dari satu/duplikat.
A HAVING clause in SQL specifies that an SQL SELECT statement should only return rows where aggregate values meet the specified conditions.
Dan juga berkat GROUP BY first_name, last_name
ya.
The GROUP BY statement is used in conjunction with the aggregate functions to group the result-set by one or more columns.
Nah jikalau ingin tambah email tinggal GROUP BY first_name, last_name, email
atau jikalau mengecilkan cakupan kasih saja semacam WHERE `office_id` = '323'
saja.
Delete Duplicates of Multiple Column
tl:dr
DELETE from table_name
USING table_name, table_name as vtable
WHERE table_name.id < vtable.id
AND (table_name.first_name=vtable.first_name)
AND (table_name.last_name=vtable.last_name)
csb
Setelah bisa mencari duplikasi pada banyak kolom tertentu, misalnya nama depan dan nama belakang, lantas gimana menghapusnya duplikasinya? Tentu dengan menyisakan salah satu row darinya. Query-nya ialah kira-kira semacam ini :
DELETE from `agent_contacts`
USING `agent_contacts`, `agent_contacts` as vtable
WHERE `agent_contacts`.id < vtable.id
AND (`agent_contacts`.first_name=vtable.first_name)
AND (`agent_contacts`.last_name=vtable.last_name)
Hint utama dari query ini adalah alias USING `agent_contacts`, `agent_contacts` as vtable
SQL aliases (AS) are used to temporarily rename a table or a column heading.
Selanjutnya dengan logika semacam WHERE `agent_contacts`.id < vtable.id
untuk memilih mana yang mau dihapus. Kalau yang ingin dihapus yang lebih besar tinggal diganti WHERE `agent_contacts`.id > vtable.id
Atau untuk mengecilkan cakupan.
DELETE from `agent_contacts`
USING `agent_contacts`, `agent_contacts` as vtable
WHERE `agent_contacts`.office_id = '323'
AND vtable.office_id = '323'
AND `agent_contacts`.id < vtable.id
AND (`agent_contacts`.first_name=vtable.first_name)
AND (`agent_contacts`.last_name=vtable.last_name)
SELECT *
FROM `agent_contacts`, `agent_contacts` as vtable
WHERE `agent_contacts`.`office_id` = '323'
AND vtable.`office_id` = '323'
AND `agent_contacts`.first_name = CONCAT(vtable.first_name,vtable.last_name)
DELETE FROM `agent_contacts`
USING `agent_contacts`, `agent_contacts` as vtable
WHERE `agent_contacts`.`office_id` = '323'
AND vtable.`office_id` = '323'
AND `agent_contacts`.first_name = CONCAT(vtable.first_name,vtable.last_name)
SELECT *
FROM `agent_contacts` , `agent_contacts` AS vtable
WHERE `agent_contacts`.`office_id` = '323'
AND vtable.`office_id` = '323'
AND CONCAT(`agent_contacts`.first_name,`agent_contacts`.last_name) = vtable.first_name