【发布时间】:2019-09-18 05:06:21
【问题描述】:
所以我有如下三个表:
成员 -> id、userId、accountId
帐户 -> id、名称
用户 -> 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')
但是当我从同一个表中搜索用户时,它也给我来自 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 与用户匹配并返回来自accountId 1 以外的成员,这是正确的,但我如何编写查询以便从accountId 列出成员并且也可以通过以下方式搜索用户表中的姓名、电子邮件。
【问题讨论】:
-
分享一些示例数据。顺便说一句,
json_build_object的功能是什么?和预期的结果集 -
您使用的是什么 DBMS --
Postgres或MySQL?您已标记mysql和psql。 -
@whatsinaname 。 . .我不明白您用于搜索的规则。如果您只想搜索帐户ID,为什么要在其他字段上进行比较?你的问题不清楚。
标签: mysql sql inner-join psql