MYSQL 4表查询
我可以用一些专家的建议来进行MYSQL查询 我想做的是: 我正在尝试创建一个页面,允许用户跨多个表执行高级搜索 四个表格分别为:MYSQL 4表查询,mysql,Mysql,我可以用一些专家的建议来进行MYSQL查询 我想做的是: 我正在尝试创建一个页面,允许用户跨多个表执行高级搜索 四个表格分别为: members, profiles, skills, genre Members: ********************************* id | member_id | login | zipcode ********************************* Profiles: ******************************
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
注意,我已经具备了计算zipcode距离并返回该范围内邮政编码列表的逻辑
在一天结束时,查询只需要返回一个带有member_id的结果列表,并从符合条件的members表中登录
我不是在寻找一个能提供答案的人(尽管我不介意答案:)。我通过尝试自己解决这个问题,学习得更好,但我需要一些帮助来开始
提前感谢。尝试此查询
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
问题中的
SQL
查询似乎有效,您只需添加其余的表和条件即可获得所需的数据
用户填写表单并希望搜索具有
(成员表)zipcode=11111或zipcode=22222(配置文件表)
承诺=任何,实践=任何,gigs=1,可用性=任何
(技能表)主唱人声=1,主唱吉他=1(流派表)
备选方案=1,现代岩石=1,重金属=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 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
SELECT m.member_id, m.login
这些条件出现在WHERE
条款中:
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.guitar = 1
AND g.alternative = 1 AND g.modern_rock = 1 AND g.heavy_metal = 1
SELECT m.member_id, m.login
允许任何
值的字段不会出现在查询中,它们不会过滤结果
可以使用中的操作符搜索多个值以查找zipcode
:
AND m.zipcode IN ('11111', '22222')
在一天结束时,查询只需要返回一个带有member_id的结果列表,并从符合条件的members表中登录
要返回的字段转到SELECT
子句:
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.guitar = 1
AND g.alternative = 1 AND g.modern_rock = 1 AND g.heavy_metal = 1
SELECT m.member_id, m.login
也许您希望按特定顺序获取成员列表,例如按其登录名排序:
ORDER BY m.login
。。。或者通过他们的一些技能;将主唱放在列表的前面:
ORDER BY s.lead_vocals DESC
(按降序排列,将1的人声排在0的人声前面
现在,如果我们把所有这些放在一起,就得到了完整的查询:
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
,例如,允许有任何值。您需要使用从表单收到的数据从片段中组合查询。感谢您的详细解释和快速响应。这非常有效。