Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 联合两个查询并标记重复项_Mysql_Sql_Join_Duplicates_Union - Fatal编程技术网

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。这对我来说是很好的,因为我可以说大于零的地方。谢谢您如何判断这些选项是完全“新”的还是从现有列表中选择的?