create database if not exists `test`; DROP TABLE IF EXISTS `files`; CREATE TABLE `files` ( `id` int(11) NOT NULL auto_increment, `filename` varchar(128) collate latin1_general_ci default NULL, PRIMARY KEY (`id`) ) engine = innodb ; DROP TABLE IF EXISTS `string_tag`; CREATE TABLE `string_tag` ( `id` int(11) NOT NULL auto_increment, `file_id` int(11) default NULL, `stringTag` varchar(128) collate latin1_general_ci default NULL, PRIMARY KEY (`id`), KEY `file_id` (`file_id`) ) engine = innodb ; DROP TABLE IF EXISTS `int_tag`; CREATE TABLE `int_tag` ( `id` int(11) NOT NULL auto_increment, `file_id` int(11) default NULL, `intTag` int(11) default NULL, PRIMARY KEY (`id`), KEY `file_id` (`file_id`) ) engine = innodb ; insert into `files`(`id`,`filename`) values (1,'poop.txt'); insert into `files`(`id`,`filename`) values (2,'pirates.doc'); insert into `string_tag`(`id`,`file_id`,`stringTag`) values (1,2,'pirate'); insert into `string_tag`(`id`,`file_id`,`stringTag`) values (2,2,'pirates'); insert into `string_tag`(`id`,`file_id`,`stringTag`) values (3,2,'hyarr'); insert into `string_tag`(`id`,`file_id`,`stringTag`) values (4,2,'matee'); insert into `string_tag`(`id`,`file_id`,`stringTag`) values (5,1,'brown'); insert into `string_tag`(`id`,`file_id`,`stringTag`) values (6,1,'loaf'); insert into `string_tag`(`id`,`file_id`,`stringTag`) values (7,1,'cornhole'); insert into `int_tag`(`id`,`file_id`,`intTag`) values (1,1,13); insert into `int_tag`(`id`,`file_id`,`intTag`) values (2,1,15); insert into `int_tag`(`id`,`file_id`,`intTag`) values (3,1,14); insert into `int_tag`(`id`,`file_id`,`intTag`) values (4,2,276); insert into `int_tag`(`id`,`file_id`,`intTag`) values (5,2,265); insert into `int_tag`(`id`,`file_id`,`intTag`) values (6,2,275); select filename from files left outer join string_tag on string_tag.file_id=files.id left outer join int_tag on int_tag.file_id=files.id where stringTag='pirates' or stringTag='are' or stringTag='cool' group by filename;