【问题标题】:Delete from 'table2' where column = 'value' IF column in 'table1' = 'value'从 'table2' 中删除 where column = 'value' IF 'table1' 中的列 = 'value'
【发布时间】:2013-07-10 23:41:06
【问题描述】:

我正在尝试执行 MySQL 查询以从 'table2' where column = 'value' IF column in 'table1' = 'value' 中删除行

我有 2 张桌子...

表 1 称为“帐户”
表 2 称为“inventoryitems”

有关“帐户”的列称为“禁止”
“inventoryitems”的相关列称为“itemid”

我想从inventoryitems 删除itemid = 2340000 如果... accounts 中的列 banned 的值为 1

额外信息:

您可以通过名为 characters 的第三个表将表 accounts 连接到 inventoryitems

accounts 具有列:id(主键)和banned

characters 有列:characteridaccountidaccountid 链接到表 accounts 中的 id)。

inventoryitems 具有列itemidcharacteridcharacterid 链接到表characterid 中的characterid

希望这会有所帮助。

【问题讨论】:

  • 他们有可以加入的栏目吗?我想是的,我只需要名字。
  • 他们没有可以连接的列...除非您从accounts 获取列id,然后获取characterid,其中accountidid 匹配acccounts 然后在inventoryitems 中找到与characterid 匹配的characterid...这可能只是让您感到困惑...
  • 如果他们不能在一个列上加入,你怎么知道哪个项目属于哪个帐户?它们必须以某种方式相关,否则您会随机删除并希望获得最好的结果。有了这些信息,我已经删除了我的答案。我的印象是有一个共同的专栏可以加入。
  • 尼克是正确的,他们需要以某种方式加入,即使通过第三张表。
  • 是的,它们通过另一个名为 characters 的表关联...我将尝试更清楚地解释并包含更多有助于关联它们的列...accounts 表有列idbanned。表inventoryitems 具有列characteriditemid。表characters 具有列accountid(连接到accounts 表列id)和characterid

标签: mysql where sql-delete


【解决方案1】:

DELETE FROM inventoryitems WHERE characterid IN (SELECT id from characters WHERE accountid IN (SELECT id from accounts WHERE banned = '1' ) ) AND itemid = '2340000';

【讨论】:

    【解决方案2】:

    试试这个,因为我从你的评论中得知他们可能会以这种方式加入。

    DELETE FROM inventoryitems WHERE characterid IN
    (SELECT characterid from characters WHERE accountid IN
    (SELECT id from accounts WHERE banned = 1))
    AND itemid = '2340000';
    

    【讨论】:

    • 好的,这似乎删除了 1 行。不确定是哪一个(这是我正在测试此查询的实时数据库的备份)。不过,还有很多其他行确实符合标准。我只需要继续运行相同的脚本即可将它们全部删除吗?
    • 我第二次运行它,没有返回任何结果......所以我不知道这个删除了什么lol......
    • 我想我现在在主要问题中再次明确了一点。
    • 编辑了我的答案,我想我现在知道如何加入他们了。
    • 其实这个还是不对的!此查询删除了inventoryitems 中的所有行,其中itemid 为“2340000”。它似乎没有检查被禁止的列是否为1!很抱歉让您失望了...但感谢您的帮助!!
    【解决方案3】:

    以下查询使用INNER JOIN 从表inventoryitems 中删除一行:

    DELETE i FROM inventoryitems i  
    INNER JOIN characters c ON i.characterid = c.characterid 
    INNER JOIN accounts a ON c.accountid = a.id 
    WHERE i.itemid = 2340000 && a.banned = 1;
    

    【讨论】:

    • 我只需要从inventoryitems 中删除行,其中itemid 的值是2340000。我在你的回答中看不到这个价值。对不起,如果我不是很清楚。
    • 嗯,我一定没有注意到您的编辑,抱歉。我刚刚尝试了您的脚本,但得到“'where 子句'中的未知列'item.itemid'”帐户表中没有 itemid 列。
    • @MattPrince - 我不明白上面应该可以正常工作(尝试使用与您相同的表结构),我认为它应该比执行两个子查询更有效。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2014-03-13
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多