MySQL查询同表单行数据并关联显示关联行名称
问题描述
我有一张名为Stores的表,结构如下:
Table: Stores | Group | ID | Name | Link | | 1 | 1 | Store A | | | 1 | 2 | Store B | 3 | | 1 | 3 | Store C | | | 2 | 4 | Store D | |
我需要执行一条查询,返回目标行的ID和Name,同时若该行的Link列存在关联ID,需新增一列显示该关联ID对应的名称。例如查询ID为2的行时,输出如下:
| ID | Name | Link | | 2 | Store B | Store C |
我尝试了以下查询语句,但Link字段始终返回NULL:
SELECT `ID`, `Name`,(SELECT `Name` FROM `Stores` WHERE Stores.ID = Stores.Link ) AS Link FROM `Stores` WHERE (`ID` LIKE '2');
请问能否实现这种查询方式?
解决方案
你的查询返回NULL是因为子查询里没有区分主表和关联表,Stores.ID = Stores.Link相当于拿当前行的ID和自己的Link对比,自然匹配不到数据。下面两种方法都能实现需求:
方法1:自连接(推荐)
逻辑清晰且性能更优,适合批量查询场景:
SELECT s1.ID, s1.Name, s2.Name AS Link FROM Stores s1 LEFT JOIN Stores s2 ON s1.Link = s2.ID WHERE s1.ID = 2;
- 用
LEFT JOIN保证即使Link为空,主行数据也能正常返回,此时Link列显示NULL - 通过
s1(主表)和s2(关联表)的别名,明确关联条件是s1.Link = s2.ID
方法2:修正子查询
给子查询的表加别名,区分主表和关联表:
SELECT `ID`, `Name`, (SELECT s2.Name FROM Stores s2 WHERE s2.ID = Stores.Link) AS Link FROM Stores WHERE ID = 2;
这里子查询的s2是关联表别名,和主表的Stores做区分,能正确匹配到关联的店铺名称。
内容的提问来源于stack exchange,提问作者sarah
相关产品推荐
相关产品推荐

