简体   繁体   English

MySQL从一个表中删除另一个表中的ID

[英]Mysql delete in one table by id's from another table

I have two tables: 我有两个表:

A
id | name

and

B
id | name

On B table i create query to select all data, where id's are in (... some values), but how can i in one query select this B - id's and delete from A where A.id = B.id ? 在B表上,我创建查询以选择ID在其中的所有数据(...一些值),但是我如何在一个查询中选择该B-id,并从A中删除A.id = B.id?

I'm new to sql.... Could not find how to combine all in one query... 我是sql的新手。...找不到如何在一个查询中组合所有内容...

*i must select from b on some like query, for example my b query: select * from B where somefieldinteger in (1,4,9,21,25) and that b.id must compare with a* *我必须在类似查询的b中选择b,例如我的b查询:从B中选择*,其中(1,4,9,21,25)中的somefieldinteger并且b.id必须与a *比较

upd this throw error 更新此抛出错误

delete `LINK_LA_TYP` FROM `LINK_LA_TYP` JOIN `LINK_ART` ON `LINK_LA_TYP`.LAT_LA_ID=`LINK_ART`.LA_ID JOIN `ARTICLES` ON `LINK_ART`.LA_ART_ID=`ARTICLES`.ART_ID WHERE (`ARTICLES`.ART_SUP_ID in (10008,10439,11005,10097,10669,11100,80,10912,10683,10675,10194,11196,1166,10730,10248,10870,11200,11059,247,10121,10911,489,10724,496,10093,10205,1318,10953,11199,11047,128,114,194,10865,11058,10345,1286,10667,10064,11077,10622,11205,10917,10344,495,10709,10954,10744,304,10957,10447,10764,10129,10862,10918,10731,11115,10095,10859,10580,1345,10177,10323,144,11182,10132,256,10941,58,10006,10017,10780,10765,10665,11110,10714,10224,750,10267,10179,10725,10774,11063,10868,10103,10676,10057,10649,255,10322,11022,309,10754,11121,10801,10018,11004,10245,146,11056,381,10781,10699,11120,11126,830,10240,11162,10436,10584,10342,10861,11190,10721,11171,10564,10545,94,10087,73,10755,10869,10547,10706,10346,444,426,10059,153,122,10674,64,113,11101,10231,10337,806,11117,10385,251,11188,491,11192,100,10792,10069,10864,11099,10246,10178,10758,10568,10230,10124,10384,10782,10726,384,10670,305,10763,10768,10585,10394,10552,498,10677,1348,168,10814,10582,10382,11093,11173,10381,427,441)) limit 50

Use delete together with join like this: deletejoin一起使用,如下所示:

mysql> create table a (id int);
mysql> insert into a values (1), (2), (3), (4);
mysql> create table b (id int);
mysql> insert into b values (2), (3);
mysql> delete a from a join b on a.id=b.id where b.id > 2;
mysql> select * from a;
+------+
| id   |
+------+
|    1 |
|    2 |
|    4 |
+------+

This scales to arbitrary number of tables, eg: 这可以扩展为任意数量的表,例如:

DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB;

This will delete from a all records that are referred from those records of b which are in turn referred from c . 这将删除a是从这些记录被称为所有记录b ,它们又被称为从c You may also add WHERE clause like this: 您还可以添加WHERE子句,如下所示:

DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB
WHERE a.status='done' AND
      b.status='open' AND
      c.status='open';

If you want to limit number of rows to be deleted, do like this: 如果要限制要删除的行数,请执行以下操作:

DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB
LIMIT 500000;

If you want to delete first 500000 rows, you need to refine which rows are first, so you need to establish some ordering among rows. 如果要删除前500000行,则需要优化最先的行,因此需要在行之间建立一些排序。 In other words you need to sort rows by some criteria and then limit like this: 换句话说,您需要按某些条件对行进行排序,然后按如下所示进行限制:

DELETE a 
FROM a 
JOIN b ON a.idA=b.idA 
JOIN c ON b.idB=c.idB
ORDER BY a.something
LIMIT 500000;
delete from A where exists (select 1 from B where A.id=B.id and B.criteria=true)

If you leave out ... and B.criteria=true it would delete all rows in A that appear in B; 如果省略...并且B.criteria = true,它将删除A中出现在B中的所有行; otherwise you delete whatever matches your criteria. 否则,您删除符合条件的所有内容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM