2010-06-05 124 views
1

我有3个表格:项目,技能和project_skills。在项目表中,我持有项目的一般数据。第二个表技能我拥有技能ID和技能名称我也有project_skills表是持有项目的技能关系。下面是表的方案:如何创建这个复杂的查询?

CREATE TABLE IF NOT EXISTS `project_skills` (
    `project_id` int(11) NOT NULL, 
    `skill_id` int(11) NOT NULL, 
    KEY `project_id` (`project_id`), 
    KEY `skill_id` (`skill_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci; 


CREATE TABLE IF NOT EXISTS `projects` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `employer_id` int(11) NOT NULL, 
    `project_title` varchar(100) COLLATE utf8_turkish_ci NOT NULL, 
    `project_description` text COLLATE utf8_turkish_ci NOT NULL, 
    `project_budget` int(11) NOT NULL, 
    `project_allowedtime` int(11) NOT NULL, 
    `project_deadline` datetime NOT NULL, 
    `total_bids` int(11) NOT NULL, 
    `average_bid` int(11) NOT NULL, 
    `created` datetime NOT NULL, 
    `active` tinyint(1) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `created` (`created`), 
    KEY `employer_id` (`employer_id`), 
    KEY `active` (`active`), 
    FULLTEXT KEY `project_title` (`project_title`,`project_description`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=3 ; 

CREATE TABLE IF NOT EXISTS `skills` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `category` int(11) NOT NULL, 
    `name` varchar(100) COLLATE utf8_turkish_ci NOT NULL, 
    `seo_name` varchar(100) COLLATE utf8_turkish_ci NOT NULL, 
    `total_projects` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `seo_name` (`seo_name`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=224 ; 

我要选择具有相关技能的名字项目。我想我必须使用JOIN,但我不知道该怎么办。由于

+0

这是值得一读一个SQL教程作为复习。 http://www.w3schools.com/sql/sql_join.asp – 2010-06-05 14:45:56

+0

请举例说明“相关技能名称”。 – 2010-06-05 20:47:30

+0

技能ID - 项目ID关系在项目技能名称中保留,但我想要在技能表中保存的技能名称。我的意思是这些技能名称通过说“相关技能名称” – mTuran 2010-06-06 22:46:03

回答

1

这听起来像一个JOIN是完全正确的:

SELECT ... 
FROM projects 
INNER JOIN project_skills ON (project_skills.project_id = projects.id) 
INNER JOIN skills ON (skills.id = project_skills.skill_id) 
+0

这将只返回具有相关技能的项目,不相关的技能名称 – 2010-06-05 20:44:40

+0

技能名称存储在skills.name列中;如果需要这些名称,那么可以简单地将列添加到“SELECT”字段的列表中 – VoteyDisciple 2010-06-06 04:36:25

1
select * from projects 
left join project_skills on projects.id = project_skills.project_id 
left join skills on project_skills.skills_id = skills .id 

记:你并不需要所有列,但是这将让你看到是怎么回事,你选择你所需要的列前。

+0

这将只返回与技能相关的项目,而不是相关技能名称 – 2010-06-05 20:44:56

+0

@OMG:我相信它会返回skills.name请解释 – Hogan 2010-06-06 13:17:06