Mysql 联合两个查询并标记重复项
我有两张桌子。一个包含所有选项,一个包含用户选择的选项以及他们创建的一些选项,这些选项可能不在选项表中 我需要合并数据,以便返回一个结果集,其中包括所有选项,以及用户选项,并以某种方式标记这些选项仅为用户,并且与主选项数据重叠 例如 选项Mysql 联合两个查询并标记重复项,mysql,sql,join,duplicates,union,Mysql,Sql,Join,Duplicates,Union,我有两张桌子。一个包含所有选项,一个包含用户选择的选项以及他们创建的一些选项,这些选项可能不在选项表中 我需要合并数据,以便返回一个结果集,其中包括所有选项,以及用户选项,并以某种方式标记这些选项仅为用户,并且与主选项数据重叠 例如 选项 `COLOR` | `ANIMAL` --------------------- RED | DOG BLUE | DOG GREEN | DOG YELLOW | CAT PINK | CAT ORANGE
`COLOR` | `ANIMAL`
---------------------
RED | DOG
BLUE | DOG
GREEN | DOG
YELLOW | CAT
PINK | CAT
ORANGE | CAT
`COLOR` | `ANIMAL`
------------------
GREEN | SNAKE
BLUE | DOG
PINK | CAT
PURPLE | CAT
用户选择的选项
`COLOR` | `ANIMAL`
---------------------
RED | DOG
BLUE | DOG
GREEN | DOG
YELLOW | CAT
PINK | CAT
ORANGE | CAT
`COLOR` | `ANIMAL`
------------------
GREEN | SNAKE
BLUE | DOG
PINK | CAT
PURPLE | CAT
我的结果需要看起来像…
`COLOR` | `ANIMAL`| `DUPLICATE_OR_NEW`
----------------------------------------
RED | DOG | 0
BLUE | DOG | 1
GREEN | DOG | 0
YELLOW | CAT | 0
PINK | CAT | 1
ORANGE | CAT | 0
PURPLE | CAT | 1
GREEN | SNAKE | 1
在这种情况下,排序顺序并不重要。我曾尝试与工会合作,但我认为我需要将两张桌子连接在一起。到目前为止,我还没有想出一个解决办法。这可能被称为作弊,但它会奏效
SELECT COLOR, ANIMAL, sum(DUPLICATE_OR_NEW)
FROM
(
SELECT COLOR, ANIMAL, 1 as DUPLICATE_OR_NEW FROM options
UNION ALL
SELECT COLOR, ANIMAL, 2 as DUPLICATE_OR_NEW FROM UserSelection
) as UTable
GROUP BY COLOR, ANIMAL
-- 1 = unchosen option
-- 2 = new user added option
-- 3 = option exsisted chosen by user
请参阅SQL Fiddle另一种方法:
select color, animal, 1 as duplicate_or_new
from UserSelected
union all
select color, animal, 0 as duplicate_or_new
from options o
where not exists (select 1 from UserSelected us where us.color = o.color and us.animal = o.animal)
使用联合所有
/组的正确方法是:
select color, animal, max(which) as duplicate_or_new
from (select color, animal, 1 as which
from UserSelected
union all
select color, animal, 0 as which
from options
) t
group by color, animal
以下查询创建两个单独的标志:
select color, animal, max(isUser) as IsUser, max(isOption) as IsOption
from (select color, animal, 1 as IsUser, 0 as IsOption
from UserSelected
union all
select color, animal, 0 as IsUser, 1 as IsOption
from options
) t
group by color, animal
您可以将它们放在案例陈述中以格式化信息:
(case when max(isUser) = 1 and max(isOption) = 1 then 'both'
when max(isUser) = 1 then 'user'
when max(isOption) = 1 then 'option'
else 'impossible'
end)
但问题是什么?如果作弊有效,我喜欢作弊。你得到的答案大约是95%。由于负1,表2中不存在的项显示为零。简单的解决方法是将选择颜色,动物,“1”更改为表\u名称2中的重复\u或\u新****以选择颜色,动物,“2”更改为表\u名称2中的重复\u或\u新。这将在列中为重叠的项添加2,为新项添加1。这对我来说是很好的,因为我可以说大于零的地方。谢谢您如何判断这些选项是完全“新”的还是从现有列表中选择的?