MySQL возвращает результаты из одной таблицы на основе данных в другой таблице - PullRequest
0 голосов
/ 21 сентября 2010

Прежде чем углубляться в проблему, сначала я объясню ситуацию. У меня есть две таблицы, такие как следующие:

USERS TABLE
user_id
username
firstName
lastName

GROUPS TABLE
user_id
group_id

Я хочу получить всех пользователей, чье имя LIKE "% foo%" и кто входит в группу с group_id = 'givengid'

Итак, запрос хотел бы что-то вроде этого:

SELECT user_id FROM users WHERE firstName LIKE '%foo'"

Я могу создать пользовательскую функцию sql, такую ​​как ismember (user_id, group_id), которая будет возвращать 1, если пользователь является частью группы, и 0, если они не являются, и это в предложении WHERE в вышеупомянутой инструкции выбора. Однако это означает, что для каждого пользователя, имя которого соответствует критериям, необходимо выполнить другой запрос через тысячи других записей, чтобы найти потенциальное совпадение для записи группы.

Таблица пользователей и групп будет содержать несколько сотен тысяч записей. Является ли более общепринятым использование подхода, определяемого пользователем, или выполнение запроса с помощью оператора UNION? Если подход UNION лучший, как будет выглядеть запрос с оператором объединения?

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

Ответы [ 3 ]

3 голосов
/ 21 сентября 2010

Вы должны использовать JOIN , чтобы получить пользователей, соответствующих вашим двум критериям.

SELECT 
  user_id 
FROM 
  users 
INNER JOIN
  groups
  ON groups.user_id = users.users_id
    AND groups.group_id = given_id
WHERE 
  firstName LIKE '%foo'
1 голос
/ 21 сентября 2010

Использовать объединение:

SELECT DISTINCT user_id 
FROM users
INNER JOIN groups ON groups.user_id = users.user_id
WHERE users.firstName LIKE '%foo'
AND groups.group_id = '23'

DISTINCT гарантирует, что в результате у вас не будет повторяющихся идентификаторов пользователей.

1 голос
/ 21 сентября 2010

Вам не нужно здесь использовать UNION или пользовательскую функцию;вместо этого вы можете использовать JOIN (который позволяет объединять одну таблицу с другой на основе набора эквивалентных столбцов):

SELECT u.user_id
FROM users AS u
JOIN groups AS g
  ON g.user_id = u.user_id
WHERE g.group_id = 'givengid'
  AND u.firstName LIKE '%foo'

Чтоэтот запрос состоит в том, чтобы соединить строки в таблице groups со строками в таблице users, когда user_id совпадает (поэтому, если бы вы использовали SELECT *, вы бы получили длинную строку, содержащую данные пользователя иданные группы для этого пользователя).Если для пользователя существует несколько строк groups, несколько строк будут извлечены до того, как они будут отфильтрованы предложением WHERE.

...