【发布时间】:2018-04-23 11:17:16
【问题描述】:
我想用 IN 子句连接两个表,但结果不正确。
表一只有一些“预订”,在一个字段中,我存储了它们应该链接到的日期的 ID。所以我的行是这样的:
id_booking 1
days 1,2,3,4
id_booking 2
days 1,2
表 2 包含每个“ID_DAY”的日期如下:
id_day 1
date 2017-10-01
id_day 2
date 2017-10-02
id_day 3
date 2017-10-03
id_day 4
date 2017-10-04
预订:
CREATE TABLE bookings ( id_booking int(11) unsigned NOT NULL AUTO_INCREMENT, days varchar(50) DEFAULT NULL, PRIMARY KEY (id_booking) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
天数:
CREATE TABLE days ( id_day int(11) unsigned NOT NULL AUTO_INCREMENT, date varchar(10) DEFAULT NULL, PRIMARY KEY (id_day) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
现在,我的想法是:
select * from bookings join days on days.id_day in (bookings.days);
这总是返回一行,而不是我期望的 N 行。我怎样才能得到我的结果?
我的问题开始于必须找到一种方法来拥有一个包含一年中所有日期的表,然后将其加入到预订表中,以便每个预订都有“N ROWS”,所以我可以过滤日期,计算它们或进行操作,但我找不到实现此目的的聪明方法。
你能给我一个提示吗?
【问题讨论】:
-
请发布确切的表结构和预期结果。
-
bookings: CREATE TABLE
bookings(id_bookingint(11) unsigned NOT NULL AUTO_INCREMENT,daysvarchar(50) 默认NULL,主键(id_booking)) ENGINE=InnoDB AUTO_INCREMENT =5 默认字符集=latin1;天:创建表days(id_dayint(11) 无符号非空 AUTO_INCREMENT,datevarchar(10) 默认空值,主键 (id_day)) ENGINE=InnoDB AUTO_INCREMENT=5 默认字符集=latin1;查询:select * from bookings join days on days.id_day in (bookings.days);我希望每天有 N 行,而不仅仅是一个。我无法弄清楚格式 -
你可以试试这个查询来解决你的问题:
Select bookings.*, GROUP_CONCAT(days.date ORDER BY days.id_day) as days From bookings LEFT JOIN days on FIND_IN_SET(days.id_day, bookings.days) > 0 -
不,我想要 N 个预订行,而不是一个具有串联日期的预订行。我解释说我需要这种方式以便在必要时过滤日期
-
它像这样工作 select * from bookings join days on FIND_IN_SET(days.id_day, bookings.days);但在一张大桌子上速度非常慢