【问题标题】:How to search from a table using join?如何使用连接从表中搜索?
【发布时间】: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 -- PostgresMySQL?您已标记mysqlpsql
  • @whatsinaname 。 . .我不明白您用于搜索的规则。如果您只想搜索帐户ID,为什么要在其他字段上进行比较?你的问题不清楚。

标签: mysql sql inner-join psql


【解决方案1】:

保持简单,也许是这样的。

 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

【讨论】:

  • 上述查询没有给我任何结果。该表是这样的,可能有不属于成员表的用户,但我只想显示那些属于成员表并且 accountId =1 并且还能够搜索姓名、电子邮件等的用户
  • 我修改了我的帖子,试试看是否可行 :) @whatsinaname 尝试根据您的意愿更改条件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
相关资源
最近更新 更多