MYSQL-条件列(如果行存在),否则默认为首先返回

MYSQL-条件列(如果行存在),否则默认为首先返回,mysql,Mysql,我确信这是非常规的,但我尝试执行以下操作: 我有下表: products_id, company_id, products_name 1, 1, shoes 1, 2, mens shoes 2, 1, pants 现在,我要做的是使用给定的products\u id和company\u id='2'从中选择一个特定的products\u名称,但是在所有情况下,如果找不到compa

我确信这是非常规的,但我尝试执行以下操作:

我有下表:

products_id, company_id, products_name
1,           1,          shoes
1,           2,          mens shoes
2,           1,          pants
现在,我要做的是使用给定的products\u id和company\u id='2'从中选择一个特定的products\u名称,但是在所有情况下,如果找不到company\u id='2'的行,我希望它默认为具有任何company\u id的相同product\u id的products\u名称

例如,如果我要搜索products\u id='2',company\u id='2',它应该返回products\u name='pants'。然而,如果我要搜索产品_id='1',公司_id='2',它应该返回'mens shoes'。如果我要搜索产品,它应该返回一个空集

我需要能够在一个SQL语句中完成这项工作,因此不需要通过PHP处理来确认是否存在一行,比如:products\u id='2'company\u id='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
演示:

我的逻辑背后的基本思想是:

创建一个查询,根据产品id输入任意产品名称-只需输入产品名称的最大值并按id分组即可。 创建一个查询,提取要筛选的公司的产品名称。 左键将2和1连接起来,这样我就有了一个产品列表,以及公司的产品名称(如果有)。由于左联接,所有产品仍将返回,但对于没有给定公司特定名称的产品,公司特定列表将为空。 从给定的公司特定列表(如果可用)中选择产品id和名称。如果不可用,则使用通用列表,该列表仅提取产品名称的最大值。这是通过coalesce函数处理的,该函数返回其列表中的第一个非空参数。因此,基本上它首先检查特定于公司的列表,如果没有可用的,则使用通用列表。
希望这有帮助

对于任何想玩它的人来说,开始脚本:嘿,非常感谢你这么全面的回答,在写完之后,我想如果我加入表本身,我可能会走上正确的轨道,但是合并功能是缺失的一部分!我现在就开始把它编进我的脚本。再次,非常感谢,非常感谢。