2015-11-03 121 views
0

我有3個表格。MySQL JOIN查詢語句

而且我可以使用一些幫助放在一起JOIN查詢。

表1:作品 這是我的主表。它包含很多不同的字段,包括一個唯一的主鍵。 它包含一個「composers_id」字段 - 涉及下一個表格。

表2:作曲家 此表包含關於「作品」表中作品的作曲家的其他信息。它包含許多領域,包括一個獨特的主鍵 - 這是「工作」涉及到的ID。

表3:works_instruments 此表包含有關作品中的樂器的其他信息。 它包含唯一的主鍵。 它包含一個「works_id」字段,它與「作品」表中的唯一ID相關。 有幾行都與每個「works_id」有關 - 因爲每個工作中都有關於每個樂器的大量信息。

以下是處理: 我需要能夠在工作表中搜索結果,但只能匹配只能在works_instruments表中檢查的條件的結果。

我想是這樣的:

"SELECT 
    works.id, 
    works.title 

FROM works 

    JOIN composers 

     ON works.composers_id = composers.id" 

那麼是什麼,如果我只需要從作品表得到的結果 - 如果在一個相關的行「works_id」 S長笛? 「works_instruments」除「works_id」字段外還包含一個「樂器」字段,該字段可能並可能不包含「長笛」一詞。 將有許多行具有相同的「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

是'works_instruments'很好的定義,還是它是一個非標準化的混亂? '儀表'在哪裏,所以'wi'表是一個結點表概念 – Drew

+2

我懷疑這個問題可能會更加冗長,但我不知道如何。 – Strawberry

+0

我建議你用每個xxx的'show create table xxx'來顯示你的模式,所以在你充滿東西之前,peeps可以給它一個友好的審查。完了,走吧。關閉投票記錄。開始輸入 – Drew

回答

0

答案是比我想象的簡單。

我剛剛添加了另一個JOIN,將work_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" 

這似乎是工作得很好。

我很抱歉浪費你的時間,實際上能夠自己做。 我想我只是不相信自己能夠做到。 :-)