如何使用 join 从 table 中搜索?

How to search from a table using join?

所以我有如下三个table:

会员 -> id, userId, accountId

账号 -> id, name

用户 -> id、名字、姓氏、电子邮件

INSERT INTO `account` (`id`, `name`) VALUES
('1', 'xyz company'),
('2', 'abc company');

INSERT INTO `users` (`id`, `email`, `firstName`, `lastName`) VALUES
('1', 'abc@gmail.com', 'earth', 'flat'),
('2', '1@gmail.com', 'One hundred', 'pin'),
('3', '2@gmail.com', 'bull', 'horn'),
('4', '3@gmail.com', 'ball', 'yellow');

INSERT INTO `members` (`id`, `userId`, `accountId`) VALUES
('1', '1', '1'),
('2', '1', '2'),
('3', '2', '1');

SELECT
  m.id,
  m.accountId,
  (
    SELECT
      JSON_BUILD_OBJECT(
        'userId', u.id, 
        'firstName', u.firstName, 
        'lastName', u.lastName, 
        'email', u.email
      )
    FROM user
    WHERE user.id = m.userId
  ) AS user
FROM users AS u
INNER JOIN members m ON m.userId = u.id
WHERE am.accountId = 1
GROUP BY m.id, u.id

上面的sql给我正确的数据如下。

('accountId', 'email', 'firstName', 'lastName')
('1', 'abc@gmail.com', 'earth', 'flat')
('1', '1@gmail.com', 'One hundred', 'pin')

但是当我搜索来自同一个 table 的用户时,它也给我来自 accountId 的数据而不是 1,而它应该只提供来自 accountId 1 的数据.

SELECT
  m.id,
  m.accountId,
  (
    SELECT
      JSON_BUILD_OBJECT(
        'userId', u.id, 
        'firstName', u.firstName, 
        'lastName', u.lastName, 
        'email', u.email
      )
    FROM user
    WHERE user.id = m.userId
  ) AS user
FROM users AS u
INNER JOIN members m ON m.userId = u.id
WHERE am.accountId = 1,
OR LOWER(u.first_name) LIKE LOWER('%gma%')
OR LOWER(u.last_name) LIKE LOWER('%gma%')
OR LOWER(u.email) LIKE LOWER('%gma%')
GROUP BY m.id, u.id

这给了我所有四个数据:

('accountId', 'email', 'firstName', 'lastName')
('1', 'abc@gmail.com', 'earth', 'flat'),
('2', 'abc@gmail.com', 'earth', 'flat'),
('1', '1@gmail.com', 'One hundred', 'pin')

结果应仅显示 accountID 1,但由于名称中存在匹配项,因此给出的结果比预期的多。

上面的查询将 LIKE 与用户和 returns 成员匹配,而不是来自 accountId 1 的成员,这是正确的,但是我如何编写查询以便列出成员来自 accountId,也可以通过用户 table.

中的姓名、电子邮件进行搜索

保持简单,大概像这样。

 SELECT 
  m.id, m.accountId,
  u.id, u.firstName, u.lastName,
  json_build_object('userId', u.id, 'firstName', u.firstName, 'lastName', u.lastName, 'email', u.email) as userobject,
  a.id as account_id,
  a.name as accountname


FROM
    users AS u
    LEFT JOIN members m ON m.userId = u.id  -- user and member

    LEFT JOIN  account as a  ON  a.id = m.accountId   -- connect to account from member

WHERE 
    (   
      u.firstName like '%gma%'
      0R 
        u.lastName  LIKE '%gma%'
       OR 
       u.email  LIKE '%gma%'
    )
 and   am.accountId = 1