我有3张桌子。
我可以使用一些帮助来组合JOIN查询。
表1:有效 这是我的主要表格。 它包含许多不同的字段,包括唯一的主键。 它包含一个“composers_id”字段 - 与下一个表有关。
表2:作曲家 此表包含有关“Works”表中作品的作曲家的其他信息。 它包含许多字段,包括唯一的主键 - 这是“作品”所涉及的ID。
表3:works_instruments 此表包含有关工程中仪器的其他信息。 它包含唯一的主键。 它包含一个“works_id”字段,该字段与“works”表中的唯一ID相关。 有几行都与每个“works_id”有关 - 因为每项工作都有很多关于每种工具的信息。
这是交易: 我需要能够在工作表中搜索结果,但只能搜索与只能在works_instruments表中检查的条件匹配的结果。
我在想这样的事情:
"SELECT
works.id,
works.title
FROM works
JOIN composers
ON works.composers_id = composers.id"
但是如果我只需要从作品表中获得结果怎么办?如果相关的行中有一个长笛" works_id" s? 除了“works_id”字段之外,“works_instruments”还包含“instrument”字段,该字段可能包含也可能不包含“flute”一词。 将有许多行具有相同的“works_id”。例如:“乐器”字段中的“长笛”为1行,“乐器”字段中为“低音”的另一行。 - 等等。
如果涉及长笛,我如何进行查询以便我只能从作品表中获取作品?
你能帮忙吗?
提前谢谢你 约翰
编辑:
这是工作表:
CREATE TABLE `works` (
`id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,
`composers_id` smallint(4) unsigned NOT NULL,
`work_no` tinytext NOT NULL,
`composer_no` tinytext NOT NULL,
`composers_full_name` tinytext,
`full_title` tinytext NOT NULL,
`short_title` tinytext NOT NULL,
`alternative_titles` tinytext NOT NULL,
`remarks` text NOT NULL,
`contents` text NOT NULL,
`first_line` tinytext NOT NULL,
`full_inst_ed4_rev4` text NOT NULL,
`duration` tinytext NOT NULL,
`sourcetext` text NOT NULL,
`chor_acc_size` tinytext NOT NULL,
`youth_commentary` text NOT NULL,
`youth_category_rev` tinytext NOT NULL,
`orchestra_type` tinytext NOT NULL,
`creation_date` date DEFAULT NULL,
`master_title_opas` tinytext NOT NULL,
`short_name` tinytext NOT NULL,
`url` tinytext,
PRIMARY KEY (`id`),
KEY `composers_id` (`composers_id`),
KEY `url` (`url`(16)),
FULLTEXT KEY `keywords` (`composers_full_name`,`full_title`)
) ENGINE=MyISAM AUTO_INCREMENT=8183 DEFAULT CHARSET=utf8
这是作曲家表:
CREATE TABLE `composers` (
`id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,
`composer_no` tinytext NOT NULL,
`name` tinytext NOT NULL,
`short_name` tinytext NOT NULL,
`birth_year` tinytext NOT NULL,
`death_year` tinytext NOT NULL,
`vitae` tinytext NOT NULL,
`catalog` text NOT NULL,
`classification` tinytext NOT NULL,
`comment` text NOT NULL,
`gender` tinytext NOT NULL,
`alerts` tinytext NOT NULL,
`corrected` tinytext NOT NULL,
`creation_date` date DEFAULT NULL,
`edition` tinytext NOT NULL,
`first_name` tinytext NOT NULL,
`full_name` tinytext NOT NULL,
`last_name` tinytext NOT NULL,
`modification_date` tinytext NOT NULL,
`name_accented` tinytext NOT NULL,
`short_name_accented` tinytext NOT NULL,
`vitae_accented` tinytext NOT NULL,
`url` tinytext,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`(16))
) ENGINE=MyISAM AUTO_
INCREMENT=1197 DEFAULT CHARSET=utf8
这是works_instruments表:
CREATE TABLE `works_instruments` (
`works_id` smallint(4) unsigned NOT NULL,
`instruments_id` smallint(4) unsigned NOT NULL,
`number` tinyint(3) unsigned NOT NULL,
`numbertext` tinytext NOT NULL,
`detail` tinytext NOT NULL,
`printout` tinytext NOT NULL,
`editable` tinytext NOT NULL,
UNIQUE KEY `works_instruments` (`works_id`,`instruments_id`),
KEY `works_id` (`works_id`),
KEY `instruments_id` (`instruments_id`),
KEY `number` (`number`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
(" instruments_id"是我之前所说的"乐器")
答案 0 :(得分:0)
答案比我想象的要简单。
我刚刚添加了另一个JOIN来包含works_instruments和正确的works_id 然后是WHERE子句,以确保包含正确的工具。
所以它看起来像这样:
"SELECT
works.id,
works.title
FROM works
JOIN composers
ON works.composers_id = composers.id
JOIN works_instruments
ON works.id = works_instruments.works_id
WHERE works_instruments.instrument_id = the instruemnt id I am asking for"
这似乎工作正常。
我为浪费你的时间而道歉,实际上能够自己做。 我想我只是不相信自己能够做到这一点。 : - )