问题描述
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_id
、nic_number
、reg_number
、full_name
行。但是代码不同。
首先 -> 获取我在查询中输入的具有相同 code
的用户(我已经为此实现了一个查询并且它工作正常)
第二 -> 然后在该数据中,我需要找到相关行(通过 nic_number
和 reg_number
检查)并仅显示那些相关行。这意味着在下面的查询中,我获得了 code
= 123
的数据。这将显示表格的第一行。
但我只需要为搜索的 nic_number
只显示具有相同 reg_number
或 code
的其余行。
这意味着表格的最后 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'))
)