我有兩個表s_filter_values和s_filter_articles。
s_filter_values: s_filter_articles:
| id | value | | articleID | valueID |
|----|-------| |-----------|---------|
| 1 | one | | 1 | 2 |
| 2 | two | | 1 | 3 |
| 3 | three | | 2 | 2 |
使用以下陳述句,我分別計算值的出現次數,我得到未鏈接到文章的值:
SELECT v.*, IFNULL(COUNT(a.articleID), 0) AS counter
FROM s_filter_values AS v
LEFT JOIN s_filter_articles AS a ON v.id = a.valueID
GROUP BY v.id
HAVING counter = 0
在這種情況下,我得到了
| id | value | counter |
| 1 | one | 0 |
我的問題是:如何使用此陳述句從s_filter_values中洗掉所有未鏈接到文章的行?
uj5u.com熱心網友回復:
我將使用子查詢來獲取表中的所有 ID。然后從 s_filter_values 中洗掉不存在的行。
DELETE FROM s_filter_values WHERE id NOT IN (SELECT DISTINCT valueID FROM s_filter_articles);
uj5u.com熱心網友回復:
一個簡單的子選擇應該這樣做:
DELETE FROM `s_filter_values`
WHERE `id` NOT IN SELECT DISTINCT `valueID` FROM `s_filter_articles`
uj5u.com熱心網友回復:
我會建議使用NOT EXIST而不是NOT IN.
本NOT EXISTS應在大資料集執行得更快。這兩種結構之間有一個關鍵區別:如果子查詢在其結果中回傳 NULL,則 NOT IN 條件將失敗,因為 null 既不等于也不不等于任何其他值。
create table s_filter_values(
id int(10),
`value` varchar(10) );
insert into s_filter_values values ( 1,'one'),( 2,'two'),( 3,'three');
create table s_filter_articles(
articleID int(10),
valueID int(10) );
insert into s_filter_articles values ( 1,2),( 1,3),( 2,2);
DELETE FROM s_filter_values
WHERE NOT EXISTS (SELECT valueID FROM s_filter_articles a where a.valueID= s_filter_values.id);
演示:https : //www.db-fiddle.com/f/7yUJcuMJPncBBnrExKbzYz/84
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/315252.html
