在mysql中使用self-join时防止重复结果

2w3kk1z5  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(355)

我有一些酒店,每个房间有不同的酒店视图,我的最终用户想要3个房间,例如每个房间有2张床,我必须组合记录,有时某些字段可能会重复,这并不重要,而用户在这种情况下可能有不同的房间类型我举例说明每个房间有2个床位号:我在得到结果时有问题:我在“mysql”中使用self-join,所有的东西都是真的,但有些问题是在这种情况下有相同的行这是我的代码:

SELECT
   table1.id,
   table2.id,
   table3.id,
   table1.num_bed,
   table2.num_bed,
   table3.num_bed 
   LEFT JOIN
      tour_package table2 
      ON table1.tour_id = table2.tour_id 
      AND table1.hotel_id = table2.hotel_id 
      AND table1.start_date = table2.start_date 
   LEFT JOIN
      tour_package table3 
      ON table2.tour_id = table3.tour_id 
      AND table2.hotel_id = table3.hotel_id 
      AND table2.start_date = table3.start_date 
WHERE
   table1.num_bed = 2 
   AND table2.num_bed = 2 
   AND table3.num_bed = 2

结果是:

请注意id,一个是table1.id,两个是table2.id,三个是table3.id
结果是:1-2-11-1-2等
我想防止这种情况,并有一个他们,请帮助我

omjgkv6w

omjgkv6w1#

我假设查询的目标是列出同一个酒店中每个记录最多3个房间,对于同一个旅行和有2张床的日期。
(老实说,我不明白这个查询的意义,因为它会在tour\u package表中列出所有两张床的房间。)
这意味着不仅1-1-2和1-2-1是重复的,而且第二个1是冗余信息。在7号酒店,只有两个房间符合这个标准:1号和2号。
在连接条件中,我要求从每个表返回一个具有不同id的记录。这将强制查询返回记录中唯一ID的列表。

SELECT
   table1.id,
   table2.id,
   table3.id,
   table1.num_bed,
   table2.num_bed,
   table3.num_bed 
FROM tour_package table1
LEFT JOIN
      tour_package table2 
      ON table1.tour_id = table2.tour_id 
      AND table1.hotel_id = table2.hotel_id 
      AND table1.start_date = table2.start_date
      AND table1.id<table2.id 
LEFT JOIN
      tour_package table3 
      ON table2.tour_id = table3.tour_id 
      AND table2.hotel_id = table3.hotel_id 
      AND table2.start_date = table3.start_date
      AND table2.id<table3.id 
WHERE
   table1.num_bed = 2 
   AND table2.num_bed = 2 
   AND table3.num_bed = 2

但是,如果酒店中至少有2个房间符合上述条件,则上述查询仍可能返回冗余数据。假设这两个房间的id为1和2,查询将返回1,2,null和2,null,null。为了解决这个问题,我只想写下:

select id, hotel_id from tour_package
where tour_package.num_bed=2
order by tour_id, hotel_id, start_date

原因:即使您的on查询也会在您的tour\u套餐表中显示所有两张床的房间。

相关问题