Mysql 删除值比第二高值低5倍的所有记录

Mysql 删除值比第二高值低5倍的所有记录,mysql,sql,Mysql,Sql,我有一个带有两个字段的价格表,code char和price decimal。我需要找到具有相同代码的所有记录,其价格比两个最高价格低5倍或更少 例如,在这种情况下,我希望删除id=1: id code price 1 1001 10 2 1001 101 3 1001 40 4 1001 201 5 1002 122 6 1002 50 删去 从myTable 我在哪里 挑选* 从…起 选择t2.id 来自myTable t

我有一个带有两个字段的价格表,code char和price decimal。我需要找到具有相同代码的所有记录,其价格比两个最高价格低5倍或更少

例如,在这种情况下,我希望删除id=1:

id   code   price
1    1001   10
2    1001   101
3    1001   40
4    1001   201
5    1002   122
6    1002   50
删去 从myTable 我在哪里 挑选* 从…起 选择t2.id 来自myTable t2 哪里有 选择1 来自myTable t3 其中t3.code=t2.code t3.price>t2.price*5 计数*>1的 T ; 我的做法:

DELETE t
FROM t
JOIN (SELECT code, 
         REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(
         GROUP_CONCAT(price ORDER BY price DESC SEPARATOR ';'), ';', 2)), ';',1))
         AS second_price
     FROM t
     GROUP BY code) s
  ON t.code = s.code
 AND t.price * 5 < s.second_price;
编辑:

事实上,这可能要容易得多:

DELETE t
FROM t
JOIN (SELECT code, 
  SUBSTRING_INDEX(SUBSTRING_INDEX(
                 GROUP_CONCAT(price ORDER BY price DESC SEPARATOR ';'),
                  ';', 2), ';',-1)  AS second_price
     FROM t
     GROUP BY code) s
  ON t.code = s.code
 AND t.price * 5 < s.second_price;

@lad2025,op表示价格必须比其他两个价格低5倍。40*5不小于200,40*5不小于101@Serge2最高值或两个值的平均值?从200改为201。最高值还是两个值的平均值-最高值。如果我们有10,20200个,我们不需要删除10个。@СССССССССССССССССССССССССССССССССССцццццц。您的意思是删除行吗?请删除COUNT*之间的空格,以避免语法错误,并将此查询更改为delete,使其符合询问者的要求:从myTable t1中删除t1,如果存在,请从myTable t2中选择1,其中t2.code=t1.code和t2.price>t1.price*5如果COUNT*>1,则无法工作:您不能指定目标表“t1”用于从子句中更新可能应该使用join删除?@Serge请测试您的解决方案,与above@Serge您不能在FROM子句Good and fast solution中指定更新的目标表“t1”,但老实说,我不能清楚地理解它。@СССССССССССССССССССССССССССССССССССССС
DELETE t
FROM t
JOIN (SELECT code, 
  SUBSTRING_INDEX(SUBSTRING_INDEX(
                 GROUP_CONCAT(price ORDER BY price DESC SEPARATOR ';'),
                  ';', 2), ';',-1)  AS second_price
     FROM t
     GROUP BY code) s
  ON t.code = s.code
 AND t.price * 5 < s.second_price;
SELECT code, 
  GROUP_CONCAT(price ORDER BY price DESC SEPARATOR ';'),
  SUBSTRING_INDEX(GROUP_CONCAT(price ORDER BY price DESC SEPARATOR ';'), ';', 2),
  SUBSTRING_INDEX(SUBSTRING_INDEX(
                 GROUP_CONCAT(price ORDER BY price DESC SEPARATOR ';'),
                  ';', 2), ';',-1)
FROM t
GROUP BY code;