我有以下场景:
1客户有两个产品列表(一个公共,一个私人),这些列表有许多产品,有些产品可以出现在两个列表中。如果产品出现在私人列表中,我想得到它,否则我会选择公共列表中的产品。
在你看来,实现这一目标的最快方法是什么?到目前为止,我已经尝试了以下几种:
- UNION ALL然后删除PHP中的重复项(性能平平)
- UNION(性能不佳)
还有其他实现这一目标的可能性吗?
编辑
这是一把小提琴,展示我的技艺http://sqlfiddle.com/#!6/41d2e/2
在fiddle中,我假设列表id为7和1,因为它们是客户1的列表id,我没有使用join,因为我已经从php中检索到了这些id。
我需要的是从私有列表中检索产品(如果存在),否则从公共中检索
作为一个更像mysql的人,我通常会在没有聚合的情况下使用group-by来完成这项工作,所以mysql按照正确的顺序进行taht只会剪切不需要的记录(这是一种糟糕的做法,但足够可靠和性能):
select *
from pricelist
where listId in (1, 7)
order by listId asc
group by artnum
因此,例如,如果我想获得客户端id 1的所有产品,我需要检索这些产品:
ID ARTNUM ARTDES LISTID PRICE
1 1000 potatoes 1 20
1 1001 carrots 7 4
由于客户端1有两个列表:1和7(土豆同时出现在列表1和7中,所以我只想把土豆放在客户端私有列表中,而不是公共列表中)
希望我足够清楚,很抱歉所有这些编辑
由于我不知道如何在纯SQL中正确地做到这一点,我使用了一种PHP方法:
- 检索不带UNION/UUNION ALL的两个查询
- 创建2个php集合
- 合并两个集合以删除重复项