【问题标题】:MySql join with IN clause not workingMySql 加入 IN 子句不起作用
【发布时间】: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_booking int(11) unsigned NOT NULL AUTO_INCREMENT, days varchar(50) 默认NULL,主键(id_booking)) ENGINE=InnoDB AUTO_INCREMENT =5 默认字符集=latin1;天:创建表days (id_day int(11) 无符号非空 AUTO_INCREMENT, date varchar(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);但在一张大桌子上速度非常慢

标签: mysql date join


【解决方案1】:

首先,为什么要将逗号分隔的值存储在列中。这违反了 1NF 规则。请尽量避免将, 分隔的字段存储到列中。

您正在使用的查询返回 2 行 -

id_booking  days    id_day      date
1           1,2,3,4 1           2017-10-01
2           1,2     1           2017-10-01

【讨论】:

  • 我怎样才能避免这样做?我想要一张有预订的表格,但我还需要过滤预订(比如酒店有入住日期、退房日期,但我想过滤两者之间的所有日期)。如果没有第二张一百万行的表,我无法为此提出解决方案(每个 id 预订都是“天表”中的一个键,每天在签入和结账之间)。
  • 这很尴尬。我认为您遇到了 [XY][1] 问题 :) 如果您告诉我们真正的问题,您可能会得到一个圆滑的答案 :) [1]:meta.stackexchange.com/questions/66377/what-is-the-xy-problem
  • 似乎没有人遇到过这个问题.. 问题解释如下:我有一张预订表。他们有一个开始和结束日期。我每次预订的每一天都有另一张桌子(1 个预订 = N 行,每天一个)。这两个表有一个共同的键:id booking。每次我需要过滤结果时,我都必须加入这两个表,但如果这些表很大,则需要很多时间(对我来说很多是 2 秒)。我需要找到另一种方法来做到这一点,而不会浪费太多时间,试图要求这个。
猜你喜欢
  • 2013-01-26
  • 2015-07-24
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多