mysql - UNION 会覆盖以前的结果吗?

标签 mysql

我对同一个表有两个查询,我需要获取第一个结果集中未出现的结果。

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

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'

UNION 不会追加已出现在第一个结果集中的行。

实际上我确实得到了类似的行

12345    no

但是 12345 确实出现在第一个结果集中(UNION 之前的查询)。

为什么会这样?

编辑:

custom_order_id 没有索引,也不是主键(尽管它实际上是唯一的) - UNION 是否需要(唯一)索引或 pk 将行识别为 < em>已经在第一个结果集中?

最佳答案

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

由于您的一半答案测试设置为"is",另一半测试设置为“否”,因此您最终可能会得到多个具有相同 ID 的订单(一个表示是,一个表示否)。

关于mysql - UNION 会覆盖以前的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26254307/

相关文章:

mysql - 按组选择字段数

mysql - 如何与指定分割字符的字段进行比较?

mysql - 查询时间很长(包括解释)

mysql - 如何查找年龄在某个范围之间的人员列表?

php - HTML 净化器在插入 mysql 之前无法使用 $_POST

从数据库输入到联系表的php mysql数据

java - 使用 MySql DB 获取 java 中准备好的语句的元数据

mysql - 创建一个包含 now() 纪元的整数默认字段值

Java、jboss、mysql、jdbc : string max lenght ?

mysql - 如果不存在开始更新插入错误