当前位置: 首页 > 知识库问答 >
问题:

如何从联接表中为每个主键项只选择一条记录?

訾高飞
2023-03-14

我有两张桌子叫酒店和描述。描述表包含每个酒店的描述。

  • 在hotels表中,id和city_id一起构成主键(id本身不是主键)
  • 在描述表中,每个酒店最多可以有8种描述类型(一般、位置、房间、外部、愉悦、包含、大堂)

我想使用酒店表和描述表更新主表。对于Hotel表中的每一条记录,我应该在主表中插入一行。当我执行左外部联接时,Hotel表中的每个记录都会产生多个记录,因为一个Hotel有0个或更多的描述类型。

我想从描述表中为每个酒店选择一个描述,它不总是第一个描述。(如果是的话,我可以用这个)。相反,我有描述类型的优先顺序。首先,我需要检查是否有“一般”描述。如果有,那么这应该是主表的描述,而酒店的其余描述应该跳过。如果“常规”描述类型不可用,那么我想检查“位置”描述类型是否可用等等。

    SELECT HOTEL_DETAILS.*,
    Description.Desc_type,
    Description.description
    FROM
     (SELECT Hotel.id,
             Hotel.city_id,
             Hotel.hotel_name,         
             City.country_code
           FROM Hotel
           LEFT OUTER JOIN City
           ON Hotel.city_id=City.city_id
     ) HOTEL_DETAILS
   LEFT OUTER JOIN Description
   ON HOTEL_DETAILS.id    =Description.id
   AND HOTEL_DETAILS.city_id    = Description.city_id

共有1个答案

穆宏胜
2023-03-14

您可以使用sql中的CASE表达式为描述类型指定顺序,按此顺序排序,然后使用您提到的链接获得组中的第一个。类似下面的东西;

SELECT HOTEL_DETAILS.*,
    CASE Description.Desc_type
      WHEN 'general' THEN 0
      WHEN 'location' THEN 1
      WHEN 'rooms' THEN 2
      WHEN 'lobby' THEN 3
      ELSE 99 
    END desc_order,
    Description.description
    FROM
     (SELECT Hotel.id,
             Hotel.city_id,
             Hotel.hotel_name,         
             City.country_code
           FROM Hotel
           LEFT OUTER JOIN City
           ON Hotel.city_id=City.city_id
     ) HOTEL_DETAILS
   LEFT OUTER JOIN Description
   ON HOTEL_DETAILS.id    =Description.id
   AND HOTEL_DETAILS.city_id    = Description.city_id
   ORDER BY HOTEL_DETAILS.id, HOTEL_DETAILS.city_id, desc_order
 类似资料:
  • 我想问一下,是否有人只能从表A中选择值。请参阅下面的hibernate代码 现在,它就像从A、B和C中选择值,而且太多了。 谢谢你吉米

  • 问题内容: 我试图从看起来像这样的数据库表结果中选择前2条记录 我试过这个查询 但是有些主题,例如失踪的地方,我什至尝试了以下链接的建议 如何选择每个组的前N行? 但是我为每个受检者得到两个以上 我究竟做错了什么? 问题答案: 您可以使用相关的子查询: 该查询通过串联三列来构造单列主键。如果您有真正的主键(如),则可以用代替。 SQL Fiddle中的示例。

  • 问题内容: 是否有更好的方法从MySQL表中获取多个“前X个”结果?当不同的 foo 的数量很少时,我可以通过联合轻松地完成此操作: 我显然可以继续为foo的每个值添加联合。但是,当foo有500多个不同的值并且我需要每个值的前X个时,这是不切实际的。 问题答案: 这种查询可以用“每组最大n”来表述,您希望每个“组”的前10个得分为“ foo”。 我建议您看一下这个链接,它很好地处理了这个问题,从

  • 问题内容: 我有一张桌子,我想在该表格的基础上从每个组中获取前N个项目。如果我设置了那将从每个组中选择第一行,或者如果我设置了那那将从每个组中选择前5行。请帮我。 问题答案: 有多种方法可以做到这一点。这是一个使用相关子查询的查询:

  • 我正试图从数据库表中检索最后一条记录。我的查询如下: MID是员工id代码,主键是id。 因为主键(在我的例子中)是整数,并且在每次插入记录时自动递增,所以我试图在主键的基础上获取最后一条记录,因为与其他记录相比,最后一条记录将具有最高值的主键。 但是我不能制定如何给出条件指定最高值的主键。我需要添加主键,如下所示:

  • 问题内容: 我有两个表: 我想从表1中选择所有具有值A和B的表2行的行。这将是行1和3(不是2行,因为它只有A,没有4行是因为只有B)。我可以在没有子查询的情况下执行此操作吗? (注意:我还需要查询表1中的值,因此我不能只查询表2。) 问题答案: 塔达阿!没有子查询。