MySQL JOIN查询短语

时间:2015-11-03 00:37:10

标签: mysql join

我有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"是我之前所说的"乐器")

1 个答案:

答案 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"

这似乎工作正常。

我为浪费你的时间而道歉,实际上能够自己做。 我想我只是不相信自己能够做到这一点。 : - )