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

时间:2011-10-08 03:29:35

标签: mysql

我确信这是非传统的,但我试图执行以下操作:

我有以下表格:

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'。

实际的应用程序使用了一个带有多个连接的更复杂的表,但是这是我无法弄清楚的这个简单的位,所以如果有人能帮我解决这个障碍,那将非常感激。

1 个答案:

答案 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

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

  1. 创建一个查询,根据产品ID提取任意产品名称 - 只需提取产品名称max并按ID分组。
  2. 创建一个查询,提取要过滤的公司的产品名称。
  3. 使用#1左连接#2,这样我就会有一个产品列表,以及公司的产品名称(如果可用)。由于左连接,仍会返回所有产品,但对于没有给定公司特定名称的产品,公司特定列表将为NULL
  4. 从给定的公司特定列表中选择产品ID和名称(如果有)。如果不可用,则使用通用列表,该列表仅提取产品名称的max。这是通过coalesce函数处理的,该函数返回其列表中的第一个非null参数。所以基本上它首先检查公司特定的列表,如果没有可用的,则使用通用列表。
  5. 希望这有帮助!