[英]MySQL regular expression to return all records where at least one word matches between 2 columns
[英]MySQL get all associated records where at least one record matches query
我正在嘗試使此MySQL搜索查詢正常工作。 我希望它返回firstName,lastName,email或至少一個secondaryEmail匹配搜索字符串的所有用戶。 一個用戶可以有許多輔助電子郵件。
這是我的SQL查詢:
SELECT `users`.`id`,
`users`.`first_name` AS `firstName`,
`users`.`last_name` AS `lastName`,
`users`.`email`,
`usersSecondaryEmails`.`id` AS `usersSecondaryEmails.id`,
`usersSecondaryEmails`.`email` AS `usersSecondaryEmails.email`
FROM `Users` AS `users`
LEFT OUTER JOIN `UsersSecondaryEmails` AS `usersSecondaryEmails`
ON `users`.`id` = `usersSecondaryEmails`.`user_id`
WHERE (`users`.`first_name` LIKE '%bob%'
OR `users`.`last_name` LIKE '%bob%'
OR `users`.`email` LIKE '%bob%'
OR `usersSecondaryEmails`.`email` LIKE '%bob%');
該查詢成功返回,但是當只有匹配的輔助電子郵件時,它僅返回該電子郵件,而不是所有關聯的電子郵件。 如果找到至少一個輔助電子郵件,如何更改此查詢以返回所有電子郵件? 我知道它很可能會在其中包含EXISTS的子查詢,但是我不太確定該放在哪里。
編輯:用戶表具有first_name,last_name和電子郵件UsersSecondaryEmails表具有user_id和電子郵件
如果用戶有2個輔助電子郵件(在UsersSecondaryEmails上的“電子郵件”列),並且其中至少有一個與搜索字符串匹配,則我希望將所有輔助電子郵件都找回來。 截至目前,此操作僅返回匹配的電子郵件。
子查詢應該做到這一點
SELECT
`users`.`id`,
`users`.`first_name` AS `firstName`,
`users`.`last_name` AS `lastName`,
`users`.`email`,
`usersSecondaryEmails`.`id` AS `usersSecondaryEmails.id`,
`usersSecondaryEmails`.`email` AS `usersSecondaryEmails.email`
FROM users users, UsersSecondaryEmails usersSecondaryEmails
WHERE users.id IN (SELECT user_id FROM UsersSecondaryEmails)
AND users.id = usersSecondaryEmails.user_id
AND
(
`users`.`first_name` LIKE '%bob%'
OR
`users`.`last_name` LIKE '%bob%'
OR
`users`.`email` LIKE '%bob%'
)
您應該使用子查詢fpor避免在其中使用與左聯接表相關的列(這會產生內部聯接)
SELECT `users`.`id`,
`users`.`first_name` AS `firstName`,
`users`.`last_name` AS `lastName`,
`users`.`email`,
t.`email` AS `usersSecondaryEmails.email`
FROM `Users` AS `users`
LEFT OUTER JOIN (
select `usersSecondaryEmails`.`user_id`, `usersSecondaryEmails`.`email`
from `UsersSecondaryEmails`
where `usersSecondaryEmails`.`email` LIKE '%bob%') t on t.`user_id` = `users`.`id
where (
`users`.`first_name` LIKE '%bob%'
OR `users`.`last_name` LIKE '%bob%'
OR `users`.`email` LIKE '%bob%'
)
我相信你想要:
SELECT u.`id`, u.`first_name` AS `firstName`, u.`last_name` AS `lastName`, u.`email`,
us.`id` AS `usersSecondaryEmails.id`,
us.`email` AS `usersSecondaryEmails.email`
FROM `Users` u LEFT OUTER JOIN
`UsersSecondaryEmails` us
ON u.`id` = us.`user_id`
WHERE (u.`first_name` LIKE '%bob%' OR u.`last_name` LIKE '%bob%' OR u.`email` LIKE '%bob%') OR
EXISTS (SELECT 1
FROM `UsersSecondaryEmails` us2
WHERE us2.user_id = us.user_id AND us2.`email` LIKE '%bob%'
);
這假設即使只有users
字段匹配,您也需要所有第二封電子郵件。 如果沒有,則可以考慮。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.