MySQL删除具有指定关键字但最大值的组中的所有内容

时间:2017-07-27 16:18:50

标签: php mysql

我正在尝试使用关键字xyz删除一组userID中的每一行,但价格最高的除外。

我尝试了很多来自SO的片段,但仍然无效。

我试过了:

DELETE FROM 
  `table` t1 
WHERE 
  `keyword` = 'xyz' AND 
  `price` <> (
    SELECT 
      MAX(`price`) 
    FROM (
      SELECT 
        * 
      FROM 
        `table` t2 
      WHERE 
        `keyword` = 'xyz' AND 
        t2.user = user
     ) t3 
  )

但它也选择价格最高的那个,它也只选择应该删除的行的一小部分

这一个......

DELETE FROM 
  `table` AS zt 
WHERE 
  `keyword` = 'xyz' AND 
  EXISTS (
    SELECT 
      * 
    FROM 
      `table` ex 
    WHERE 
      ex.user = zt.user AND 
      ex.price > zt.price
  );

给我以下错误:

where子句中的未知表字段zt.user。如果我添加INNER JOIN,则表示未知关键字。

4 个答案:

答案 0 :(得分:1)

在Mysql中,在依赖内部查询中使用table x时,无法从table x删除,即使您为它们提供了不同的别名。

您的内部查询依赖,因为您在第一个示例中使用zt或外部查询的user上的非别名访问权。

最简单的选项是2个查询:首先,获取要删除的ID,然后删除它们。 (实现取决于您的编程语言)

只有一个查询才能使用连接。

更新:根本无法进行所有类型的内部查询(没有连接或没有多个查询)。

更新II:在设置derived_merge=off时,有其他查询嵌套内部查询的选项 - 但这真的很难看,请加入。

答案 1 :(得分:1)

使用带子查询的JOIN:

DELETE t1
FROM `table` t1
JOIN (
    SELECT user, max(price) as price
    FROM `table`
    GROUP BY user
) t2 ON t2.user = t1.user
    AND t2.price <> t1.price
WHERE t1.keyword = 'xyz'

子查询中可能需要WHERE keyword = 'xyz'。这取决于你的逻辑。

答案 2 :(得分:0)

尝试像

这样的事情
DELETE FROM `table` WHERE `keyword` = 'xyz' AND `price` NOT IN (SELECT MAX(`price`) FROM table)

这很粗鲁,但应该工作

答案 3 :(得分:0)

 DELETE FROM `table` WHERE `keyword` = 'xyz' AND `primarykey` !=
 (SELECT `primarykey` FROM `table` WHERE `price` = (SELECT MAX(`price`) FROM 
 `table`) LIMIT 1);