SQL多列具有一列作为关系

时间:2019-03-07 23:56:32

标签: sql

我有一个名为engrams的表,其中有列

mat_name1, mat_name2, mat_name3, mat_name4

与列resources上的表id有关系。

我有这个SQL语句

SELECT * 
FROM engrams 
INNER JOIN resources ON engrams.mat_name1 = resources.id

如何为其他mat_name添加resources.id列,如何为每个res_nameresources表中回显mat_name列?

engrams table

resources table

2 个答案:

答案 0 :(得分:2)

您需要将JOINengramsresources表四次,每种材料名称一次。由于JOIN表的每个resources都有相似的列名,因此您可能需要在应用程序框架中使用别名来区分它们:

SELECT e.name,
       e.description,
       e.mat_name1, r1.res_name AS res_name1, r1.description AS res_descr1,
       e.mat_name2, r2.res_name AS res_name2, r2.description AS res_descr2,
       e.mat_name3, r3.res_name AS res_name3, r3.description AS res_descr3,
       e.mat_name4, r4.res_name AS res_name4, r4.description AS res_descr4
FROM engrams e
LEFT JOIN resources r1 ON r1.id = e.mat_name1
LEFT JOIN resources r2 ON r2.id = e.mat_name2
LEFT JOIN resources r3 ON r3.id = e.mat_name3
LEFT JOIN resources r4 ON r4.id = e.mat_name4

答案 1 :(得分:1)

如果我正确理解了您的问题,那么您要做的就是在您的OR子句中添加ON语句。

SELECT * 
FROM engrams 
INNER JOIN resources 
ON engrams.mat_name1 = resources.id
    or engrams.mat_name2 = resources.id
    or engrams.mat_name3 = resources.id
    or engrams.mat_name4 = resources.id

按原样,该查询将返回字母和资源的所有值。如果您不想要所有内容,只需明确定义要执行的操作,例如:

SELECT resources.res_name, engrams.mat_name1, engrams.mat_name2, engrams.mat_name3,engrams.mat_name4
FROM engrams 
INNER JOIN resources 
ON engrams.mat_name1 = resources.id
    or engrams.mat_name2 = resources.id
    or engrams.mat_name3 = resources.id
    or engrams.mat_name4 = resources.id

如果“ echo the column”还有其他含义,则必须包括一些示例输出或其他内容。