2014-12-03 3 views
0

Я мог бы использовать некоторые советы экспертов с запросом MYSQL, который я пытаюсь собрать.MYSQL 4 Table Query

Что я хотел бы сделать:

Я пытаюсь создать страницу, которая позволит пользователям осуществлять расширенный поиск по нескольким таблицам.

В 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) 

Форма поиска будет ряд флажков и выпадающие, которые позволили бы пользователю определить конкретные пункты, которые они хотят искать.

Что мне нужна помощь с:

мне нужна помощь придумывают лучший способ поставить этот вопрос вместе. Я читал на Joins, Unions, Sub Queries и Derived таблицах. Я могу сделать некоторые основные вопросы и получить часть данных, например:

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 и войти в таблицу участников, соответствующую критериям.

Я не ищу кого-то, кто просто дал бы ответ (хотя я бы не прочь ответить :)) Я узнаю лучше, пытаясь разобраться в этом самостоятельно, но мне нужна помощь.

Заранее спасибо.

ответ

0

SQL запрос в вопросе, кажется, действительно, вам просто нужно добавить остальные таблицы и условия для получения данных, которые вы хотите.

пользователь заполняет форму и хочет найти для всех членов с (таблица членов) почтовый индекс = 11111 OR почтовый индекс = 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 значение не появляются в запросе, они не фильтруйте результаты.

Searching более чем одно значение для 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

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