在MySQL中,子查询返回的行数多于直接相同的查询

时间:2017-06-02 18:13:01

标签: mysql

我想根据-std=c++11listings.product_id

的组合删除重复项

这个简单的查询返回400.000行(我要保留的行的id):

listings.channel_listing_id

虽然此变体返回1.600.000行(表中的所有记录),但不仅is_verified = 0:

SELECT id FROM `listings` WHERE is_verified = 0 GROUP BY product_id, channel_listing_id

我希望他们返回相同数量的行。 这是什么原因?如何避免它(为了在DELETE语句的where条件中使用subselect)?

编辑:我发现在SELECT * FROM (SELECT id FROM `listings` WHERE is_verified = 0 GROUP BY product_id, channel_listing_id) AS keepem ""修复了#{1}}它(它应该返回400.000条记录)。我仍然不确定是否应该相信此子查询,因为SELECT DISTINCT语句中没有SELECT

编辑2:似乎只是phpMyAdmin报告行总数的方式中的一个错误。

2 个答案:

答案 0 :(得分:1)

您的查询不明确。假设您有两个具有相同product_id和channel_id的列表。然后应该返回id的内容?第一个,第二个?或两者都忽略了GROUP请求?

如果不同产品和渠道ID 多个ID 会怎样?

选择MAX(id) AS id并添加DISTINCT。

,尝试消除歧义

是否有任何外键需要担心?如果没有,您可以将原始表格倒入副本中,清空原始表格并仅将其复制回非重复内容。 Messier,但你只能保证SELECTs或DELETE成功,你也可以保留备份。

答案 1 :(得分:0)

指定别名以避免字段引用歧义:

SELECT 
    keepem.*
FROM
    (
    SELECT 
        innerStat.id
    FROM
        `listings` AS innerStat
    WHERE
        innerStat.is_verified = 0
    GROUP BY
        innerStat.product_id,
        innerStat.channel_listing_id
) AS keepem