Mysql 联合会覆盖以前的结果吗`

Mysql 联合会覆盖以前的结果吗`,mysql,Mysql,我在同一个表上有两个查询,我需要得到第一个结果集中没有出现的结果 有几种方法可以到达那里(我不要求),我的第一次尝试是: SELECT * FROM ( SELECT o.custom_order_id AS 'order', 'yes' AS 'test' FROM orders WHERE <first criteria> UNION SELECT o.custom_order_

我在同一个表上有两个查询,我需要得到第一个结果集中没有出现的结果

有几种方法可以到达那里(我不要求),我的第一次尝试是:

SELECT * FROM
(
    SELECT
        o.custom_order_id AS 'order',
        'yes'      AS 'test'
    FROM orders
    WHERE <first criteria>

    UNION

    SELECT
        o.custom_order_id AS 'order',
        'no'      AS 'test'
    FROM orders
    WHERE <second criteria>
) x
WHERE x.test = 'no'
但是
12345
确实出现在第一个结果集中(在
UNION
之前查询)

为什么

编辑:

custom\u order\u id
没有索引,也不是主键(尽管它实际上是唯一的)UNION是否需要(唯一的)索引或主键来识别第一个结果集中已经存在的行?

您只会得到带有“no”的行,因为这是您在
WHERE
子句末尾指定的:

WHERE x.test = 'no'

消除该选项后,
UNION
将从联合查询返回唯一行


UNION
不一定需要键,尽管优化查询几乎总是一个好主意:)尝试运行
EXPLAIN(上面带有UNION的查询在这里)
并查看生成的内容。

UNION
使用整个元组来确定行是否唯一。在您的情况下,即(订单、测试)


由于一半答案的测试设置为“是”,一个为“否”,您可以得到具有相同id的多个订单(一个为是,一个为否)。

UNION
将返回唯一的行<代码>12345是和<代码>12345否是两个唯一的行。在您的示例中,如果删除
test
字段,您将得到您想要的。@AdrianoRepetti这正是我的错误。有人能告诉我我的答案有什么问题吗?否决票把我弄糊涂了:)不是我否决票(我通常不会对我自己的问题的答案否决票),但我认为这是因为哪里不是问题所在:-),所以我只是误解了这个问题。Thx.我太专注于订单id了,以至于我完全看不到我的测试旗劳尔:-)谢谢你们和阿德里亚诺。
WHERE x.test = 'no'