我确信这是非传统的,但我试图执行以下操作:
我有以下表格:
products_id, company_id, products_name
1, 1, shoes
1, 2, mens shoes
2, 1, pants
现在,我想要做的是使用给定的products_id和company_id ='2'从中选择一个特定的products_name,但是在所有没有找到company_id ='2'的行的情况下我希望它默认给我带有与anyY company_id相同的product_id的products_name。
例如,如果我要搜索products_id ='2',则company_id ='2'应该返回products_name ='pants'。但是,如果我要搜索products_id ='1',company_id ='2'它应该返回'mens shoes'。如果我要搜索products_id ='3',company_id = any - 它应该返回一个空集。
我需要能够在一个SQL语句中执行此操作,因此不能通过PHP进行处理以确认是否存在一行,如:products_id ='2'company_id ='2'。
实际的应用程序使用了一个带有多个连接的更复杂的表,但是这是我无法弄清楚的这个简单的位,所以如果有人能帮我解决这个障碍,那将非常感激。
答案 0 :(得分:2)
这是一个查询,它将返回公司的产品,或者如果整个产品列表中没有该公司的特定产品,则返回任何通用产品。最后可以使用额外的where products_id = ##
轻松过滤(或者在两个内部子查询中放置where
过滤器,这可能实际上更有效):
set @company_id = 2;
select
coalesce(p2.products_id, p1.products_id) as products_id,
coalesce(p2.products_name, p1.products_name) as products_name
from
(select products_id, max(products_name) as products_name
from products group by products_id) p1
left join
(select products_id, products_name
from products where company_id = @company_id) p2
on p1.products_id = p2.products_id
演示:http://sqlize.com/pkt568O0b5
我的逻辑背后的基本思想是:
max
并按ID分组。NULL
。max
。这是通过coalesce
函数处理的,该函数返回其列表中的第一个非null参数。所以基本上它首先检查公司特定的列表,如果没有可用的,则使用通用列表。希望这有帮助!