2014-12-03 53 views
0

我可以使用一些專家建議與MYSQL查詢我試圖放在一起。MYSQL 4表查詢

什麼,我想這樣做:

我試圖創建一個頁面,允許用戶執行跨多個表的高級搜索。

四個表是:

members, profiles, skills, genre 

Members: 
********************************* 
id | member_id | login | zipcode 
********************************* 

Profiles: 
********************************************************************* 
id | member_id | exp | commitment | practice | gigs | availability 
********************************************************************* 

Skills: 
************************************************************************ 
id | member_id | lead_vocals | background_vocals | guitar | bass| drums 
************************************************************************ 

Genre: 
******************************************************************************** 
id | member_id | alternative | classic_rock | modern_rock | blues | heavy_metal 
******************************************************************************** 

Skills and Genre represent check box values checked or not (1 or 0) 

搜索表單將是一系列的複選框和下拉菜單,將允許用戶指定要搜索的具體項目。

我需要什麼幫助:

我需要幫助想出把這個查詢起來的最佳方式。我一直在閱讀關於聯接,聯盟,子查詢和派生表。我可以做一些基本的查詢,並得到例如部分數據:

SELECT members.member_id FROM members LEFT JOIN skills ON members.member_id = skills.member_id WHERE skills.leadvocals = 1  

不過,我只是不能似乎環繞把他們放在一起我的頭。

An example of the search criteria would look something like this: 

A user fills out the form and wants to search for all members with (members table) zipcode = 11111 OR zipcode = 22222 (profiles table) commitment = ANY, practice = ANY, gigs = 1, availability = ANY (skills table) lead_vocals = 1 and lead_guitar = 1 (genre table) alternative = 1, modern_rock = 1, heavy_metal = 1 

注意我已經有邏輯來計算郵政編碼距離並返回範圍內的郵政編碼列表。

在一天結束時,查詢只需返回member_id結果列表並從符合條件的成員表登錄。

我不是在找人提供那個答案(儘管我不介意這個答案:))通過試圖找出自己的想法,我學得更好,但我需要一些幫助入門。

在此先感謝。

回答

0

SQL查詢在這個問題似乎是有效的,你只需要添加表和條件的其餘部分得到你想要的數據。

用戶填寫表單並想要搜索所有成員 (部件表)郵政編碼= 11111或郵政編碼= 22222(配置文件表) 承諾= ANY,實踐= ANY,演出= 1,可用性= ANY (技能表)lead_vocals = 1和lead_guitar = 1(種類表) 替代= 1,modern_rock = 1,heavy_metal = 1

您在請求的查詢已經把一半,但它是用英語編寫的,碰巧SQL只是英文的一小部分。

你提到的表出現在FROM子句中:

FROM members m 
    INNER JOIN profiles p USING (member_id) 
    INNER JOIN skills s USING (member_id) 
    INNER JOIN genre g USING (member_id) 

的情況出現在WHERE子句中:

WHERE p.gigs = 1 
    AND s.lead_vocals = 1 AND s.guitar = 1 
    AND g.alternative = 1 AND g.modern_rock = 1 AND g.heavy_metal = 1 

,讓ANY值不會出現在查詢的字段,他們不要過濾結果。

搜索zipcode多個值可以使用IN操作來完成:

AND m.zipcode IN ('11111', '22222') 

在一天的查詢只需要返回結果的列表,從member_id和登錄結束會員表匹配標準。

要返回的領域轉到SELECT條款:

SELECT m.member_id, m.login 

也許你想在一個特定的順序成員名單,例如通過其登錄名稱排序:

ORDER BY m.login 

...或通過他們的一些技能;把主唱列表的前面:

ORDER BY s.lead_vocals DESC 

(降序排列得到那些1在那些列有0面前現在lead_vocals

,如果我們把所有在一起,我們得到了完整的查詢:

SELECT m.member_id, m.login 
FROM members m 
    INNER JOIN profiles p USING (member_id) 
    INNER JOIN skills s USING (member_id) 
    INNER JOIN genre g USING (member_id) 
WHERE p.gigs = 1 
    AND s.lead_vocals = 1 AND s.lead_guitar = 1 
    AND g.alternative = 1 AND g.modern_rock = 1 AND g.heavy_metal = 1 
    AND m.zipcode IN ('11111', '22222') 
ORDER BY s.lead_vocals DESC, m.login 

因爲你從用戶輸入的信息,你事先不知道practice,例如,允許有ANY價值。你需要編寫查詢從片斷中,使用從表單收到的數據。

+0

感謝您的詳細解釋和快速響應。這很好。 – JimmyF 2014-12-03 16:23:29

0

試試這個查詢。

select 
m.* 
from 
members m 
left join Profiles p on p.member_id = m.id 
left join Skills s on s.member_id = m.id 
left join Genre g on g.member_id = m.id 
where (m.zipcode = 11111 OR m.zipcode = 22222) and p.gigs = 1 and s.lead_vocals = 1 and s.lead_guitar = 1 and g.alternative = 1, g.modern_rock = 1, g.heavy_metal = 1