I am finding this to be quite a complicated query.
I am trying to get the data for each event, from the several tables that it is stored in.
there may or may not be an image, so I made a LEFT OUTER join.
I’ll post the query and then the create table statements and would appreciate your help.
Also, should foreign keys go from grandchild to child or straight to the parents? eg, event_images linking to ‘events_data’ OR should it link directly, to ‘events’
bazz
select
base_events.event_id
, base_events.event_name_in_home_language
, base_events.live_from
, base_events.live_to
, event_data.file_data as file_data
, pd.pricing_data as pricing_data
, c.symbol_left
, c.symbol_right
, ei.image
FROM events as base_events
INNER
JOIN ( SELECT id
, event_id
, GROUP_CONCAT(
CONCAT_WS( ','
, ed.file_heading
, ed.text_block_sequence
, ed.text_or_list
, ed.file_text
, ei.image
) order by ed.text_block_sequence
SEPARATOR ';' ) AS file_data
FROM events_data eda
left outer
join event_images as imgs
on imgs.event_id = eda.event_id
) as ed
ON ed.event_id = base_events.event_id
INNER
JOIN ( select eh.event_id
, GROUP_CONCAT(
CONCAT_WS( ','
, eh.day_of_week
, eh.opening
, eh.closing
, ep.price
, ep.text_price
, ep.age_group
)
SEPARATOR ';' ) as pricing_data
FROM events_hours as eh
INNER
JOIN events_prices as ep
on ep.event_id = eh.event_id
and ep.hours_id = eh.hours_id
GROUP
BY ep.event_id
) as pd
ON pd.event_id = base_events.event_id
INNER
JOIN business_currencies as bc
ON bc.business_id = base_events.business_id
INNER
JOIN currency as c
on c.currency = bc.currency
#where base_events.business_id = 123
CREATE TABLE IF NOT EXISTS `events` (
`event_id` int(11) NOT NULL auto_increment,
`business_id` int(11) NOT NULL,
`content_category` varchar(99) collate utf8_unicode_ci NOT NULL,
`live_from` date NOT NULL,
`live_to` date NOT NULL,
`event_name_in_home_language` varchar(32) collate utf8_unicode_ci NOT NULL,
`last_updated` timestamp NOT NULL default CURRENT_TIMESTAMP,
`last_updated_by` varchar(99) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`event_id`),
UNIQUE KEY `business_file_name_fk` (`business_id`,`event_name_in_home_language`),
KEY `fnhl_ix` (`event_name_in_home_language`),
KEY `business_id` (`business_id`),
KEY `files_categories_fk` (`business_id`,`content_category`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
CREATE TABLE IF NOT EXISTS `events_data` (
`id` bigint(11) NOT NULL auto_increment,
`event_id` int(11) NOT NULL,
`language_abbr_this_file` varchar(3) collate utf8_unicode_ci NOT NULL default 'ENG',
`displayed_event_name` varchar(99) collate utf8_unicode_ci default NULL,
`text_block_sequence` tinyint(2) unsigned zerofill NOT NULL,
`text_or_list` varchar(4) collate utf8_unicode_ci NOT NULL default 'text',
`file_heading` varchar(255) collate utf8_unicode_ci default NULL,
`file_text` text collate utf8_unicode_ci NOT NULL,
`last_updated` timestamp NOT NULL default CURRENT_TIMESTAMP,
`last_updated_by` varchar(32) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`event_id`,`text_block_sequence`),
KEY `lang_ix` (`language_abbr_this_file`),
KEY `file_ix` (`event_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=122 ;
--
-- Constraints for dumped tables
--
--
-- Constraints for table `events_data`
--
ALTER TABLE `events_data`
ADD CONSTRAINT `event_data_event_fk` FOREIGN KEY (`event_id`) REFERENCES `events` (`event_id`)
CREATE TABLE IF NOT EXISTS `events_hours` (
`hours_id` bigint(20) NOT NULL auto_increment,
`event_id` int(11) NOT NULL,
`day_of_week` varchar(99) collate utf8_unicode_ci default NULL,
`opening` time default '00:00:00',
`closing` time default '00:00:00',
PRIMARY KEY (`hours_id`),
UNIQUE KEY `event_id` (`event_id`,`day_of_week`,`opening`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=162 ;
--
-- Constraints for dumped tables
--
--
-- Constraints for table `events_hours`
--
ALTER TABLE `events_hours`
ADD CONSTRAINT `event_hours_events_fk` FOREIGN KEY (`event_id`) REFERENCES `events` (`event_id`) ;
CREATE TABLE IF NOT EXISTS `events_prices` (
`event_id` int(20) NOT NULL,
`hours_id` bigint(11) NOT NULL,
`price` varchar(64) collate utf8_unicode_ci default NULL,
`text_price` varchar(99) collate utf8_unicode_ci default NULL,
`age_group` varchar(99) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`event_id`,`hours_id`,`age_group`),
KEY `event_prices_hours_fk` (`hours_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Constraints for dumped tables
--
--
-- Constraints for table `events_prices`
--
ALTER TABLE `events_prices`
ADD CONSTRAINT `event_prices_hours_fk` FOREIGN KEY (`hours_id`) REFERENCES `events_hours` (`hours_id`);
CREATE TABLE IF NOT EXISTS `event_images` (
`event_id` int(11) NOT NULL,
`file_text_id` bigint(20) NOT NULL,
`image` varchar(99) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`file_text_id`,`image`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
--
-- Constraints for dumped tables
--
--
-- Constraints for table `event_images`
--
ALTER TABLE `event_images`
ADD CONSTRAINT `image_file_data_fk` FOREIGN KEY (`file_text_id`) REFERENCES `events_data` (`id`);