0

作成しようとしているクエリのロジックを理解しようとしています。

これは、誰かに靴下を探しに行くように頼むのと同じですが、靴下自体ではなく、見つけたものだけを返します。

さて、予約 54,321 には 3 つのデータ オブジェクトがあるとしましょう。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

結局、私は自分でそれを理解しました。最後の 4 つの INNER JOIN 部分から、テーブルに別名を付ける必要があったことがわかります。

選択する

   bookings.booking_id, DATE_FORMAT(bookings.creation_date, '%a %D %b %y') AS 作成日, DATE_FORMAT(bookings.modification_date, '%a %D %b %y') AS 修正日, bookings.client_id,

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

   venues.venue_id AS 会場 ID、venues.name AS 会場、venues.town_city、

   DATE_FORMAT((

       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 client_options FROM bookings_attendees INNER JOIN 予約 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 client ON (clients.client_id = bookings_clients.client_id) AND (clients.client_id = '1') INNER JOIN 会場 ON (venues.venue_id = bookings.venue_id)

INNER JOIN bookings_clients_options a1 ON (a1.client_id = '3') INNER JOIN bookings_clients_options_data a2 ON (a1.bookings_client_option_id = a2.bookings_client_option_id) AND (a2.booking_attendee_id = bookings_attendees.booking_attendee_id)

INNER JOIN bookings_clients_options b1 ON (b1.client_id = '3') INNER JOIN 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') b2.value = 'Y')

GROUP BY bookings.booking_id ORDER BY bookings_attendees.stay_date

于 2013-03-27T12:51:03.493 に答える