2010-06-09 7 views
2

J'écris une sorte de moteur de recherche pour mon application web et j'ai un problème. J'ai 2 tables d'abord est la table des projets:Rechercher une question SQL entre deux tables connexes

PROJETS TABLEAU

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 TABLEAU

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

Par exemple: Je veux poser cette question à la base de données:

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). 

Veuillez écrire une requête SQL qui assure ces conditions. Je vous remercie.

+0

Une requête pour toutes les conditions ou juste chaque requête pour chaque condition? – vodkhang

+2

Quand vous dites que les compétences sont 5 et 7 - cela signifie-t-il que les résultats peuvent avoir ou doivent avoir les deux? –

+0

@vodkhang Pour toutes les conditions. @OMG Ponies 5 Ou 7 – mTuran

Répondre

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 

ou

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 

Selon ce que votre résultat escompté est.

3

Il semble que vous cherchiez une requête EXISTS, qui vérifie que les lignes correspondantes existent dans une table, mais sans effectuer de 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; 
Questions connexes