0

我试图了解我正在尝试编写的查询的逻辑。

这相当于让某人去找一只袜子,但只返回他们找到的东西,而不是袜子本身。

好的,假设预订 54,321 有三个数据对象;123、124 和 125。我运行查询以查看数据对象 125 是否是袜子,如果是,则也返回 123 沙发和 124 地毯。或者,更具体地说,它可以找到的任何数据对象。目前,它只返回它找到的东西,即袜子。

我会解释发生了什么。每个预订可以有任意数量的相关数据对象或记录。我将其中一些记录用作标志,以标记需要特别注意的预订。所以我要找的袜子真的是一面旗帜!但我不想要标志,我想要包含实际数据的其他记录。

我还有其他查询正在工作,我在其中检索预订和所有相关记录,但不是在这种情况下。

我正在使用一个表来存储实际存储的数据类型,与客户端建立关系:

CREATE TABLE IF NOT EXISTS `bookings_clients_options` (
  `bookings_client_option_id` mediumint(11) NOT NULL AUTO_INCREMENT,
  `creation_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `modification_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `client_id` mediumint(11) NOT NULL,
  `type` enum('text','textarea','checkbox','radio','select','multiselect') NOT NULL DEFAULT 'text',
  `rules` text NOT NULL,
  `value` text NOT NULL,
  `label` varchar(128) NOT NULL,
  `name` varchar(128) NOT NULL,
  `id` varchar(128) NOT NULL,
  `note` text NOT NULL,
  `process` enum('Y','N') NOT NULL DEFAULT 'N',
  `mode` enum('public','private','closed') NOT NULL DEFAULT 'public',
  PRIMARY KEY (`bookings_client_option_id`),
  KEY `index` (`client_id`)
);

我正在为实际数据本身使用表格,与预订建立关系:

CREATE TABLE IF NOT EXISTS `bookings_clients_options_data` (
  `bookings_client_option_data_id` mediumint(11) NOT NULL AUTO_INCREMENT,
  `creation_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `modification_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `bookings_client_option_id` mediumint(11) NOT NULL,
  `booking_attendee_id` mediumint(11) NOT NULL,
  `value` text NOT NULL,
  PRIMARY KEY (`bookings_client_option_data_id`),
  KEY `index` (`bookings_client_option_id`,`booking_attendee_id`)
);

希望这是有道理的。

任何想法在伪代码或实际代码中可能是什么样的查询?

4

1 回答 1

0

最后,我自己想通了。您将从最后四个 INNER JOIN 部分中看到我必须为表起别名:

选择

   bookings.booking_id, DATE_FORMAT(bookings.creation_date, '%a %D %b %y') AS creation_date, DATE_FORMAT(bookings.modification_date, '%a %D %b %y') AS modify_date, bookings.client_id,

   bookings_attendees.name, DATE_FORMAT(bookings_attendees.stay_date, '%a %D %b %y') AS stay_date, bookings_attendees.stay_nights,

   场地.venue_id AS 场地_id,场地.name 作为场地,场地.town_city,

   日期格式((

       SELECT MAX(bookings_history.modification_date) AS booking_history FROM bookings_history WHERE (bookings_history.booking_id = bookings.booking_id)

   ), '%a %D %b %y, %H:%i') AS booking_history,

   COALESCE(GROUP_CONCAT(DISTINCT a2.value SEPARATOR 0x1D), 'NULL') AS clients_options FROM bookings_attendees INNER JOIN bookings ON (bookings.booking_id = bookings_attendees.booking_id) AND (bookings.client_id = '3') AND (bookings.status = '确认') AND (bookings.mode = 'public') INNER JOIN bookings_clients ON (bookings.booking_id = bookings_clients.booking_id) INNER JOIN clients ON (clients.client_id = bookings_clients.client_id) AND (clients.client_id = '1') INNER加入场地 (venues.venue_id = bookings.venue_id)

内部联接 bookings_clients_options a1 ON (a1.client_id = '3')

内部联接 bookings_clients_options b1 ON (b1.client_id = '3') 内部联接 bookings_clients_options_data b2 ON (b1.bookings_client_option_id = b2.bookings_client_option_id) AND (b2.booking_attendee_id = bookings_attendees.booking_attendee_id) AND (b2.bookings_client_option_id = '4') AND ( b2.value = 'Y')

GROUP BY bookings.booking_id ORDER BY bookings_attendees.stay_date

于 2013-03-27T12:51:03.493 回答