簡體   English   中英

MySQL獲取所有關聯記錄,其中至少一條記錄與查詢匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM