按特定列获取与搜索行相关的行

问题描述

我正在尝试对以下场景实施 sql 查询

user_id nic_number reg_number full_name 代码
B123 12345 1212 约翰 123
B124 12346 1213 彼得 124
B125 12347 1214 Darln 125
B123 12345 1212 约翰 126
B123 12345 1212 约翰 127

在subscribers 表中,可以有相同的user_idnic_numberreg_numberfull_name 行。但是代码不同。

首先 -> 获取我在查询中输入的具有相同 code用户(我已经为此实现了一个查询并且它工作正常)

第二 -> 然后在该数据中,我需要找到相关行(通过 nic_number reg_number 检查)并仅显示那些相关行。这意味着在下面的查询中,我获得了 code = 123 的数据。这将显示表格的第一行。 但我只需要为搜索nic_number显示具有相同 reg_numbercode 的其余行。 这意味着表格的最后 2 行。

select code,GROUP_CONCAT(distinct trim(nic_number)) as nic_number,GROUP_CONCAT(distinct trim(reg_number)) as reg_number,GROUP_CONCAT(distinct trim(full_name)) as full_name from subscribers
where code like lower(concat('123')) group by code;

我需要通过改变上面的查询来实现这个场景的SQL查询。(只有一个查询,没有连接或触发器)。 我已经尝试了很长时间,但无法得到结果。如果你们中的任何人帮助我得到结果,那将非常有帮助。

解决方法

我不知道你为什么指定了“没有连接”——我知道你可能不想在表上有触发器(无论如何你不需要实现这个),但是 JOIN 是标准的 SQL 语法这将帮助您实现您所追求的结果。

试试:

SELECT
s1.code,s1.nic_number,s1.reg_number,s1.full_name
FROM subscribers s1
INNER JOIN
(
    SELECT nic_number,reg_number
    FROM subscribers
    WHERE code = '123'
) s2
ON s1.nic_number = s2.nic_number
AND s1.reg_number = s2.reg_number
WHERE s1.code <> '123';

或者,如果您真的需要完全不使用 JOIN 来实现它,那么您只需将需要包含的子查询加倍:

SELECT
s1.code,s1.full_name
FROM subscribers s1
WHERE s1.nic_number IN
(
    SELECT nic_number FROM subscribers
    WHERE code = '123'
)
AND s1.reg_number IN
(
    SELECT reg_number FROM subscribers
    WHERE code = '123'
)
AND s1.code <> '123';

后一种查询不一定是理想的,但仍然达到了预期的结果。

,

您可以将 nic 和 reg 编号组合在一个唯一的键中以获取您的记录。

已编辑 仅提取相关行而不是代码搜索的行, 顺便说一句,代码在订阅者表中似乎不是唯一的。

select 
    code,trim(nic_number) as nic_number,trim(reg_number) as reg_number,trim(full_name) as full_name,trim(code) as code 
from 
    subscribers s1
where 
    code <> lower(trim('123')) 
    and trim(nic_number) + '|' + trim(reg_number) IN (
        select trim(nic_number) + '|' + trim(reg_number)
        from subscribers
        where code = lower(trim('123'))
    )