请查看我的表格结构如下:
Area_PrimaryTable 和 Area_SecondaryTable 中的数据将映射到Table_TableID
。我想知道当我查询AreaID
= A101时如何获取表100和111的状态ID?
Select * from Area where AreaID = A101
更新 我找到了构建此类查询的方法,但不确定是否有更好的方法?
请告知如下:
Select * from Table where TableID in
(
Select PrimaryTable from Area where AreaID = 'A101'
union
Select SecondaryTable from Area where AreaID = 'A101'
)
答案 0 :(得分:3)
这是JOIN
特别有用的例子。看一下,因为JOIN
是最终在使用SQL时经常被使用的东西。它们基本上允许您从几个相关表中获取信息,作为同一记录的一部分。
因此,您希望从两行Table获取信息,它们的关系是它们链接到Area中的同一行。我会认为你只想获得两种身份。这可以通过以下代码解决:
SELECT t1.Status, t2.Status
FROM Area AS a
JOIN Table AS t1 ON t1.TableID = a.PrimaryTable
JOIN Table AS t2 ON t2.TableId = a.SecondaryTable
WHERE AreaID = 'A101'
请注意,虽然在我的书中使用SELECT *
时可以进行实验,但我相信在生产代码中应该避免使用,而是明确命名要从中获取信息的列。
编辑:尽管存在明显的差异,但请注意我的代码提案与Xtoxico的行为相同。据我所知,这两个提案都是等效的。
答案 1 :(得分:0)
试试这个......
SELECT
t1.status as StatusPrimary, t2.status as StatusSecondary
FROM
Area as a,
table as t1,
table as t2
WHERE
a.primaryTable=t1.TableID and
a.secondaryTable=t2.TableId and
a.AreaID = A101;
你的Sample返回两行,我的代码在同一行返回信息
答案 2 :(得分:0)
我建议这个:
select t.* from table t, area a
where a.AreaID = 'A101'
and t.TableID in (a.PrimaryTable, a.SecondaryTable)
答案 3 :(得分:0)
试试这个
SELECT a.AreaID, t.TableID, t.TableName, t.Status FROM table1 t
INNER JOIN (
Select PrimaryTable, areaId from Area
union
Select SecondaryTable, areaID from Area
) a ON t.TableID = a.PrimaryTable order by a.AreaID
输出将如下所示(基于表的结构)
我希望这就是您所寻找的答案,如果您只需要找到A101区域,您只需在WHERE AreaID = 'A101'
之后添加a ON t.TableID = a.PrimaryTable
即可。
SELECT a.AreaID,
MAX(IF(a.PrimaryTable = t.TableID, t.Status, null)) as T1,
MAX(IF(a.SecondaryTable = t.TableID, t.status,null)) as T2
FROM Table1 t INNER JOIN Area a ON a.PrimaryTable = t.TableID OR a.SecondaryTable = t.TableID
GROUP BY AreaID