将表组合到单个表中的MySQL语句

将表组合到单个表中的MySQL语句,mysql,Mysql,所以我并不擅长复杂的MySQL语句,所以我希望你们能帮助我 假设我有四个表,MainTable、AttrTable、NameTable和ValueTable MainTable如下所示: | id | title | category | ......................... | 1 | First | Cat1 | ......................... | 2 | Second| Cat2 | .........................

所以我并不擅长复杂的MySQL语句,所以我希望你们能帮助我

假设我有四个表,MainTable、AttrTable、NameTable和ValueTable

MainTable如下所示:

| id | title | category |
.........................
| 1  | First | Cat1     |
.........................
| 2  | Second| Cat2     |
.........................
| 3  | Third | Cat3     |
| id | mainId | nameId | valueId |
..................................
| 1  | 1      | 1      | 2       |
..................................
| 2  | 1      | 2      | 1       |
..................................
| 3  | 2      | 1      | 3       |
..................................
| 4  | 3      | 3      | 2       |
..................................
| 1  | 3      | 1      | 1       |
| id | title |           | id | title |
..............           ..............
| 1  | foo   |           | 1  | bar   |
..............           ..............
| 2  | john  |           | 2  | smith |
..............           ..............
| 3  | dink  |           | 3  | fink  |
AttrTable如下所示:

| id | title | category |
.........................
| 1  | First | Cat1     |
.........................
| 2  | Second| Cat2     |
.........................
| 3  | Third | Cat3     |
| id | mainId | nameId | valueId |
..................................
| 1  | 1      | 1      | 2       |
..................................
| 2  | 1      | 2      | 1       |
..................................
| 3  | 2      | 1      | 3       |
..................................
| 4  | 3      | 3      | 2       |
..................................
| 1  | 3      | 1      | 1       |
| id | title |           | id | title |
..............           ..............
| 1  | foo   |           | 1  | bar   |
..............           ..............
| 2  | john  |           | 2  | smith |
..............           ..............
| 3  | dink  |           | 3  | fink  |
NameTable和ValueTable分别如下所示:

| id | title | category |
.........................
| 1  | First | Cat1     |
.........................
| 2  | Second| Cat2     |
.........................
| 3  | Third | Cat3     |
| id | mainId | nameId | valueId |
..................................
| 1  | 1      | 1      | 2       |
..................................
| 2  | 1      | 2      | 1       |
..................................
| 3  | 2      | 1      | 3       |
..................................
| 4  | 3      | 3      | 2       |
..................................
| 1  | 3      | 1      | 1       |
| id | title |           | id | title |
..............           ..............
| 1  | foo   |           | 1  | bar   |
..............           ..............
| 2  | john  |           | 2  | smith |
..............           ..............
| 3  | dink  |           | 3  | fink  |
因此,我想编写一条语句,将与MainTable的每一行相关联的所有数据合并到它自己的行中。我想要一份能给我回报的工作,比如:

| 1 | First | Cat1 | foo | smith | john | bar |
| 2 | Second| Cat2 | foo | fink  |
etc...
| 1 | First  | Cat1 | foo  | smith |
| 1 | First  | Cat1 | john | bar   |
| 2 | Second | Cat2 | foo  | fink  |
etc...
可能吗?我甚至会满足于这样的事情:

| 1 | First | Cat1 | foo | smith | john | bar |
| 2 | Second| Cat2 | foo | fink  |
etc...
| 1 | First  | Cat1 | foo  | smith |
| 1 | First  | Cat1 | john | bar   |
| 2 | Second | Cat2 | foo  | fink  |
etc...
希望这一切都有意义。提前感谢您的帮助。

查询未选中!(可能需要调整)

从主表m中选择m.*、n.title、v.title 在a.mainId=m.id上连接表a n.id=a.nameId上的联接名称表n 未选中v.id=a.valueId查询上的联接值表v!(可能需要调整)

从主表m中选择m.*、n.title、v.title 在a.mainId=m.id上连接表a n.id=a.nameId上的联接名称表n
在v.id=a.valueId上连接ValueTable v听起来您只是想要这样:

select m.id,
    m.title,
    m.category,
    n.title,
    v.title
from maintable m
left join attrtable a
    on m.id = a.mainid
left join nametable n
    on a.nameid = n.id
left join valuetable v
    on a.valueid = v.id

看听起来你只是想要这个:

select m.id,
    m.title,
    m.category,
    n.title,
    v.title
from maintable m
left join attrtable a
    on m.id = a.mainid
left join nametable n
    on a.nameid = n.id
left join valuetable v
    on a.valueid = v.id

看,这很有效!但我忘了在我的问题中提到,我还想显示MainTable中没有任何行的行。i、 e.我仍然希望看到MainTable中的第3行,即使它不在AttrtTable中。@gordon您可以将第一个联接更改为
左联接
,而不是
内部联接
。然后,如果
attr
表为空,您将获得记录。这非常有效!但我忘了在我的问题中提到,我还想显示MainTable中没有任何行的行。i、 e.我仍然希望看到MainTable中的第3行,即使它不在AttrtTable中。@gordon您可以将第一个联接更改为
左联接
,而不是
内部联接
。然后,如果
attr
表为空,您将获得记录。