2010-06-09 4 views
2

Я пишу какую-то поисковую систему для своего веб-приложения, и у меня есть проблема. У меня 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

+2

Когда вы говорите, что навыки 5 и 7 - означает ли это, что результаты могут иметь или или должны быть оба? –

+0

@vodkhang На всех условиях. @OMG Ponies 5 or 7 – mTuran

ответ

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; 
Смежные вопросы