2010-06-09 29 views
2

我正在为我的web应用程序编写某种搜索引擎,并且遇到问题。我有2代表第一的是项目表:在相关两个表之间搜索SQL问题

项目表

id     int(11)   NO  PRI  NULL auto_increment 
employer_id   int(11)   NO  MUL  NULL  
project_title  varchar(100) NO  MUL  NULL  
project_description text   NO    NULL  
project_budget  int(11)   NO    NULL  
project_allowedtime int(11)   NO    NULL  
project_deadline datetime  NO    NULL  
total_bids   int(11)   NO    NULL  
average_bid   int(11)   NO    NULL  
created    datetime  NO  MUL  NULL  
active    tinyint(1)  NO  MUL  NULL  

PROJECTS_SKILLS表

project_id   int(11)   NO  MUL  NULL  
skill_id   int(11)   NO  MUL  NULL  

例如:我要问这个查询数据库:

1-) Skills are 5 and 7. 
2-) Order results by created 
3-) project title contains "php" word. 
4-) Returned rows should contain projects.* columuns. 
5-) Projects should be distinct(i don't want same projects in return of query). 

请编写确保这些条件的sql查询。谢谢。

+0

针对所有条件的一个查询或针对每个条件的每个查询? – vodkhang 2010-06-09 00:42:50

+2

当你说技能是5和7时 - 这是否意味着结果可以具有或者必须具有? – 2010-06-09 00:45:22

+0

@vodkhang 适用于所有条件。 @OMG Ponies 5或7 – mTuran 2010-06-09 00:52:18

回答

3
SELECT projects.* 
FROM projects 
WHERE EXISTS (
     SELECT * 
     FROM projects_skills 
     WHERE skill_id = 5 
      AND project_id = projects.project_id 
    ) 
    AND EXISTS (
     SELECT * 
     FROM projects_skills 
     WHERE skill_id = 7 
      AND project_id = projects.project_id 
    ) 
    AND project_title LIKE '%php%' 
ORDER BY created 

SELECT projects.* 
FROM projects 
WHERE EXISTS (
     SELECT * 
     FROM projects_skills 
     WHERE skill_id IN (5, 7) 
      AND project_id = projects.project_id 
    ) 
    AND project_title LIKE '%php%' 
ORDER BY created 

根据您预期的结果是什么。

3

这听起来像你正在寻找一个EXISTS查询,它验证表中存在匹配的行,但没有执行JOIN。

SELECT * 
FROM projects 
WHERE EXISTS (SELECT 1 FROM projects_skills AS ps WHERE ps.project_id = projects.project_id AND ps.skill_id IN (5, 7)) 
    AND project_title LIKE '%php%' 
ORDER BY created;