使用SQL链接多个表的结果

时间:2011-06-23 16:15:57

标签: mysql

我有一组具有以下结构的表

**EntityFields**
fid | pid
1   | 1
2   | 1
3   | 2
4   | 2
5   | 1

**Language**
id | type    | value
1  | Entity  | FirstEntity
2  | Entity  | SecondEntity
1  | Field   | Name
2  | Field   | Age
3  | Field   | Name
4  | Field   | Age
5  | Field   | Location

现在您可能已经理解,第一个表为每个实体提供了EntityField分配。第二个表格给出了这些ID的名称。我想要输出的内容类似于以下

1  | FirstEntity / Name      (i.e. a concat of the Entity and the EntityField name)
2  | FirstEntity / Age
3  | FirstEntity / Location
4  | SecondEntity / Name
5  | SecondEntity / Age

这可能吗?


感谢您的回答,遗憾的是表结构是我无法改变的。它自己的表结构属于另一个数据目录系统,它非常灵活,我用它来提取数据。我知道如果没有提供必要的背景,这个表结构看起来很奇怪,但是它的效果非常好(除了在这种情况下)。

我会在这里试试这些例子并告诉你。

4 个答案:

答案 0 :(得分:2)

对于您当前的表结构,我认为以下内容将起作用

SELECT EntityFields.fid, CONCAT(L1.value, ' / ' L2.value)
FROM EntityFields INNER JOIN Language as L1 ON EntityFields.pid=L1.id and L1.type='Entity'
INNER JOIN Language as L2 ON EntityFields.fid=L2.id and L2.type='Field'
ORDER BY EntityFields.fid

但是,通过拥有更好的表结构,可以更轻松地进行此查询。例如,使用以下结构:

**EntityFields**
fid | pid | uid
1   | 1   | 1
2   | 1   | 2
1   | 2   | 3
2   | 2   | 4
3   | 1   | 5

**Entities**
id | value
1  | FirstEntity
2  | SecondEntity

**Fields**
id | value
1  | Name
2  | Age
3  | Location

您可以使用稍微简单的查询:

SELECT uid, CONCAT(Entities.value, Fields.value)
FROM EntityFields INNER JOIN Entities ON EntityFields.pid=Entities.id
INNER JOIN Fields ON EntityFields.fid=Fields.id
ORDER BY uid

答案 1 :(得分:0)

如果我理解你的问题,我认为我不这样做,这很简单。它似乎是一组设计非常糟糕的表格(例如,语言不止一件事)。并且看起来语言表有两种类型的记录:a)实体记录,其具有type ='Entity'和b)Field记录,其具有type ='Field'。

无论如何,我接近它的方式是将语言表视为两个表:

select ef.fid, Entities.value, Fields.value
from entityfields ef
  inner join language Entities
    on Entities.id = ef.id
    and Entities.type = 'Entity'
  inner join language Fields
    on Fields.id = ef.id
    and Fields.Type = 'Field'
order by 2, 3

无论如何,首先刺伤。这应该可以帮助你得到答案。

答案 2 :(得分:0)

好吧,我不知道你在这里想要完成什么。事实上,你标记一些记录“实体”和其他“字段”,然后尝试将它们彼此连接,这使我看起来像你在同一个表中混合两个完全不同的东西。为什么不拥有实体表和字段表?

您可以通过编写

来获得您想要的结果
select fid, le.value, lf.value
from entittyfields e
join language le on e.pid=le.id and type='Entity'
join language lf on e.fid=lf.id and type='Field'
order by fid

但我认为重新考虑你的桌面设计是明智的。也许你可以解释一下你想要完成的事情。

答案 3 :(得分:0)

SELECT ef.fid AS id
     , COALESCE(e.value, '-', ef.pid, ' / ', f.value)
       AS entity_field
FROM EntityFields ef
  JOIN Language AS e
    ON e.id = ef.id
    AND e.type = 'Entity'
  JOIN Language AS f
    ON f.id = ef.id
    AND f.type = 'Field'
ORDER BY ef.pid
       , ef.fid