我正在尝试使用关键字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
,则表示未知关键字。
答案 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);