MYSQL 4表查询

MYSQL 4表查询,mysql,Mysql,我可以用一些专家的建议来进行MYSQL查询 我想做的是: 我正在尝试创建一个页面,允许用户跨多个表执行高级搜索 四个表格分别为: members, profiles, skills, genre Members: ********************************* id | member_id | login | zipcode ********************************* Profiles: ******************************

我可以用一些专家的建议来进行MYSQL查询

我想做的是:

我正在尝试创建一个页面,允许用户跨多个表执行高级搜索

四个表格分别为:

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
,例如,允许有
任何
值。您需要使用从表单收到的数据从片段中组合查询。

感谢您的详细解释和快速响应。这非常有效。