問題
A資料表欄位為 post_id
B資料表的欄位為 url
A跟B都有很多資料
A跟B有些 post_id 跟 url 是相符的 ,有些是不相符的 (A跟B有關聯性的欄位是 post_id 跟 url )
如何把不相符的都刪除?只留下有關聯性的
DELETE a, b FROM
`a`
JOIN `b` ON b.ID != a.post_id
這樣卻失敗了....?
mariaDB 報錯誤:#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'JOIN b ON b.ID != a.post_id' at line 3
然後又說
a, b 這一段是預期以外的符號?
PS:
首先mysql 沒有一次delete 兩表語法
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
所以你的 DELETE a, b FROM ...
是無效的語法
這個問題和兩個變數交換值一樣的概念,
你需要使用一張臨時表存取其中一表(A
或B
)的資料.
先刪除其中一張表 之後再利用TempTable刪除另一張表
在這邊我會推薦使用 not exists
語法,因為看起來比較直觀
這裡是一個範例
Schema (MySQL v5.7)
CREATE TABLE A(
post_id INT
);
INSERT INTO A VALUES (1);
INSERT INTO A VALUES (2);
INSERT INTO A VALUES (3);
INSERT INTO A VALUES (4);
CREATE TABLE B(
ID INT
);
INSERT INTO B VALUES (2);
INSERT INTO B VALUES (3);
INSERT INTO B VALUES (35);
INSERT INTO B VALUES (36);
CREATE TEMPORARY TABLE IF NOT EXISTS temp1 AS (SELECT * FROM A);
DELETE FROM A
WHERE not exists (
SELECT 1
FROM B
WHERE B.ID = A.post_id
);
DELETE FROM B
WHERE not exists (
SELECT 1
FROM temp1 t1
WHERE B.ID = t1.post_id
);
Query #1
SELECT * FROM A;
post_id |
---|
2 |
3 |
Query #2
SELECT * FROM B;
ID |
---|
2 |
3 |
原來是這樣,所以這一大段是直接放 phpmyadmin 的SQL跑
temp1 是啥?
我把A跟B改成我對應的那個table名
我不知道是不是 A 有多個的關係?好像沒有動靜
可以用PHP做這件事嗎?可以從哪個思路下手
temp1 是啥?
temp1是我創立的臨時表 http://www.mysqltutorial.org/mysql-temporary-table/
我不知道是不是 A 有多個的關係?好像沒有動靜
你的 A 有多個的關係是什麼意思? 如果是有外鍵問題你需要提供所有資料表完整欄位資訊 我才能知道問題在哪
可以用PHP做這件事嗎?可以從哪個思路下手
這個是資料庫的事情XD, 不用也沒必要使用PHP.
直接在mysql engine上實作就好了
話說,在SQL沒有 != 只有 <>
不過你的情況應該不能這樣做,
我想可能是這樣做不過沒有實際試過,
DELETE FROM `a` LEFT JOIN `b` ON b.ID = a.post_id WHERE `b`.ID IS NULL
如果不能直接刪除就要先把資料抓出來,
然後再刪除,
如果你兩邊都有資料可能要做兩次,
把a
跟b
的角色互換再做一次.