2010-02-26 65 views
1

我需要一些關於我試圖設置的MySQL查詢的幫助。我需要找到符合條件的記錄,這些條件位於兩個不同的表格中,具有多對多的關係。需要關於MySQL搜索查詢的幫助

我在這個查詢中使用三個表格,第一個包含項目,第二個包含主題,第三個包含主題,第三個將它們連接在一起。我希望查詢找到與用戶選擇的主題相關的項目。用戶也可以選擇多個主題來執行搜索。在這種情況下,我只想顯示與這兩個主題相關的項目,而不是其中任何一個。這是我無法弄清楚如何去做的。我期望我不得不做這樣的事情,但是這個查詢不會產生任何結果,同時有一個項目鏈接到數據庫中的兩個主題。

SELECT `projects`.* 
FROM `projects`, `topics`, `projects_topics` 
WHERE (`name` LIKE '%%' || `vision` LIKE '%%' || `highlights` LIKE '%%' || `optional` LIKE '%%') 
    && ((`projects_topics`.`projects_id` = `projects`.`id` && `projects_topics`.`topics_id` = `topics`.`id` && `topics`.`id` = '1') 
     && (`projects_topics`.`projects_id` = `projects`.`id` && `projects_topics`.`topics_id` = `topics`.`id` && `topics`.`id` = '9')) 
ORDER BY `date_added` DESC 

這些都是表:

項目

+--------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| fields_id | int(11)  | NO | PRI | NULL |    | 
| name   | varchar(255) | YES |  | NULL |    | 
| address  | varchar(255) | YES |  | NULL |    | 
| zip   | varchar(255) | YES |  | NULL |    | 
| city   | varchar(255) | YES |  | NULL |    | 
| state  | varchar(255) | YES |  | NULL |    | 
| countries_id | int(11)  | NO | PRI | NULL |    | 
| website  | varchar(255) | YES |  | NULL |    | 
| client  | varchar(255) | YES |  | NULL |    | 
| finished  | date   | YES |  | NULL |    | 
| budget  | int(11)  | YES |  | NULL |    | 
| vision  | text   | YES |  | NULL |    | 
| highlights | text   | YES |  | NULL |    | 
| innovation | text   | YES |  | NULL |    | 
| optional  | text   | YES |  | NULL |    | 
| publish  | tinyint(1) | YES |  | NULL |    | 
| date   | datetime  | YES |  | NULL |    | 
| featured  | tinyint(1) | YES |  | NULL |    | 
| frontpage | tinyint(1) | YES |  | NULL |    | 
| date_added | datetime  | YES |  | NULL |    | 
+--------------+--------------+------+-----+---------+----------------+ 

主題

+-------+--------------+------+-----+---------+----------------+ 
| Field | Type   | Null | Key | Default | Extra   | 
+-------+--------------+------+-----+---------+----------------+ 
| id | int(11)  | NO | PRI | NULL | auto_increment | 
| topic | varchar(255) | YES |  | NULL |    | 
| order | int(11)  | YES |  | NULL |    | 
+-------+--------------+------+-----+---------+----------------+ 

projects_topics

+-------------+---------+------+-----+---------+-------+ 
| Field  | Type | Null | Key | Default | Extra | 
+-------------+---------+------+-----+---------+-------+ 
| projects_id | int(11) | NO | PRI | NULL |  | 
| topics_id | int(11) | NO | PRI | NULL |  | 
+-------------+---------+------+-----+---------+-------+ 

回答

1
SELECT p.* 
FROM (
     SELECT project_id 
     FROM project_topics pt 
     WHERE topics_id IN (5, 9) 
     GROUP BY 
       project_id 
     HAVING COUNT(*) = 2 
     ) pto 
JOIN projects p 
ON  p.project_id = pto.project_id 

SELECT p.* 
FROM projects p 
WHERE EXISTS 
     (
     SELECT NULL 
     FROM project_topics pt 
     WHERE pt.project_id = p.project_id 
       AND pt.topic_id IN (5, 9) 
     LIMIT 1 OFFSET 1 
     ) 

確保在project_topicsPK被定義爲(project_id, topic_id)(以該順序),或創建(topic_id, project_id)額外UNIQUE索引。

+0

讓我看看我是否理解正確。例如,如果用戶只選擇1個主題,則需要將OFFSET設置爲0.如果他們選擇2個主題,則需要將OFFSET設置爲1.如果選擇了3個主題,則需要將其設置爲2,依此類推。正確? – Abel 2010-02-26 14:11:25

+0

@Abel:正好。 – Quassnoi 2010-02-26 14:52:54