2014-12-03 65 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